POJ - 1840 - Eqs = 思维

                http://poj.org/problem?id=1840

                题意:求 \(a_1x_1^3+a_2x_2^3+a_3x_3^3+a_4x_4^3+a_5x_5^3=0\) 的整数解,其中所有变量的取值都是 \([-50,50]\) ,且 \(x_i \neq 0\)

                暴力枚举,但是要怎么分两半呢?事实证明是前半部分分2个,后半部分分3个会更好,为什么呢?

                大概是多了一个 \(\log_{2}{100}\)吧,也是差不多7倍常数了。

                前半部分分两个是:
                \(O(n^2\log(n^2)+n^3\log(n^2))\)

                前半部分分三个就白白多了7倍常数,实属逗比。

                可惜POJ用不了unordered_map,待会手写一发hash看看?

                #include<algorithm>
                #include<cmath>
                #include<cstdio>
                #include<cstring>
                #include<iostream>
                #include<map>
                #include<set>
                #include<stack>
                #include<string>
                #include<queue>
                #include<vector>
                using namespace std;
                typedef long long ll;
                
                map<int, int> M;
                
                int main() {
                #ifdef Yinku
                    freopen("Yinku.in", "r", stdin);
                #endif // Yinku
                    int a1, a2, a3, a4, a5;
                    scanf("%d%d%d%d%d", &a1, &a2, &a3, &a4, &a5);
                    for(int x1 = -50; x1 <= 50; ++x1) {
                        if(x1 == 0)
                            continue;
                        int p1 = a1 * x1 * x1 * x1;
                        for(int x2 = -50; x2 <= 50; ++x2) {
                            if(x2 == 0)
                                continue;
                            int p2 = a2 * x2 * x2 * x2;
                            M[p1 + p2]++;
                        }
                    }
                    ll ans = 0;
                    for(int x3 = -50; x3 <= 50; ++x3) {
                        if(x3 == 0)
                            continue;
                        int p3 = a3 * x3 * x3 * x3;
                        for(int x4 = -50; x4 <= 50; ++x4) {
                            if(x4 == 0)
                                continue;
                            int p4 = a4 * x4 * x4 * x4;
                            for(int x5 = -50; x5 <= 50; ++x5) {
                                if(x5 == 0)
                                    continue;
                                int p5 = a5 * x5 * x5 * x5;
                                map<int, int>::iterator it = M.find(-p3 - p4 - p5);
                                if(it != M.end())
                                    ans += it->second;
                            }
                        }
                    }
                    printf("%lld\n", ans);
                }

                一个假的哈希,大概就是把它按余数分裂成几棵平衡树来减小树的规模,大概取值合理的话可以快3倍左右(原本平衡树应该是 \(\log_2{10^6}=20\) 的,套个余数哈希(余数为 \(5\times10^4\) )就快了三倍,大概符合 \(\log_2{10^2}=7\) ),注意初始化map是需要时间的,所以并不是余数取越大越好,而且的确会创建map的实例,占用内存空间。

                #include<algorithm>
                #include<cmath>
                #include<cstdio>
                #include<cstring>
                #include<iostream>
                #include<map>
                #include<set>
                #include<stack>
                #include<string>
                #include<queue>
                #include<vector>
                using namespace std;
                typedef long long ll;
                
                const int MAXN = 49999;
                struct HashTable {
                    map<int, int> M[MAXN];
                    void insert(int x) {
                        int p = x % MAXN;
                        if(p < 0)
                            p += MAXN;
                        M[p][x]++;
                    }
                    int count(int x) {
                        int p = x % MAXN;
                        if(p < 0)
                            p += MAXN;
                        map<int, int>::iterator it = M[p].find(x);
                        if(it != M[p].end())
                            return it->second;
                        return 0;
                    }
                } ht;
                
                //寻找n以内的一个最大的质数
                /*const int MAXP=2e6;
                bool np[MAXP+1];
                void find_p(int n){
                    np[1]=1;
                    for(int i=1;i<=n;++i){
                        if(np[i])
                            continue;
                        for(int j=i+i;j<=n;j+=i)
                            np[j]=1;
                    }
                    for(int i=n;;--i){
                        if(!np[i]){
                            printf("MAXP=%d\n",i);
                            break;
                        }
                    }
                }*/
                
                int main() {
                #ifdef Yinku
                    freopen("Yinku.in", "r", stdin);
                #endif // Yinku
                    //find_p(5e4);
                    int a1, a2, a3, a4, a5;
                    scanf("%d%d%d%d%d", &a1, &a2, &a3, &a4, &a5);
                    for(int x1 = -50; x1 <= 50; ++x1) {
                        if(x1 == 0)
                            continue;
                        int p1 = a1 * x1 * x1 * x1;
                        for(int x2 = -50; x2 <= 50; ++x2) {
                            if(x2 == 0)
                                continue;
                            int p2 = a2 * x2 * x2 * x2;
                            ht.insert(p1 + p2);
                        }
                    }
                    ll ans = 0;
                    for(int x3 = -50; x3 <= 50; ++x3) {
                        if(x3 == 0)
                            continue;
                        int p3 = a3 * x3 * x3 * x3;
                        for(int x4 = -50; x4 <= 50; ++x4) {
                            if(x4 == 0)
                                continue;
                            int p4 = a4 * x4 * x4 * x4;
                            for(int x5 = -50; x5 <= 50; ++x5) {
                                if(x5 == 0)
                                    continue;
                                int p5 = a5 * x5 * x5 * x5;
                                ans += ht.count(-p3 - p4 - p5);
                            }
                        }
                    }
                    printf("%lld\n", ans);
                }

                但是假如哈希套哈希再套平衡树说不定会快到飞起?

                相关文章
                相关标签/搜索
                香港王中王论坛资枓香港正香四肖八码期期准精选资料app,四肖八码期期准精选资料最新官方版app预约 新邵县| 濮阳县| 马龙县| 抚远县| 镇坪县| 和平区| 固安县| 丰宁| 麻江县| 龙川县| 云安县| 丰镇市| 盐城市| 汽车| 婺源县| 宜春市| 绍兴市| 海城市| 水城县| 尼勒克县| 阿图什市| 海淀区| 潍坊市| 横峰县| 东海县| 武安市| 米林县| 资阳市| 大同县| 香河县| 社旗县| 宁强县| 探索| 错那县| 庆城县| 逊克县| 博爱县| 中超| 河北区| 丁青县| 靖西县| 永定县| 盐津县| 嵊泗县| 黄平县| 海林市| 广饶县| 大冶市| 二连浩特市| 卢湾区| 高邑县| 安康市| 伊川县| 女性| 苏尼特左旗| 平定县| 万年县| 呼图壁县| 潞西市| 达州市| 平凉市| 宁德市| 华坪县| 平武县| 东乡县| 辉南县| 施秉县| 台州市| 皮山县| 富宁县| 九江县| 渭源县| 林口县| 平邑县| 鄂州市| 文昌市| 钦州市| 平邑县| 阳原县| 乐山市| 浏阳市| 阜新| 河西区| 无棣县| 蒙阴县| 湄潭县| 广平县| 林州市| 望奎县| 兰坪| 宜宾县| 双城市| 张掖市| 临泉县| 仲巴县| 武川县| 宁国市| 鲁山县| 中方县| 开平市| 陆丰市| 泰宁县| 秦皇岛市| 奉化市| 方山县| 滁州市| 丰原市| 漳州市| 丰顺县| 筠连县| 札达县| 墨江| 安图县| 民县| 修文县| 镇远县| 东辽县| 连州市| 砀山县| 马公市| 封丘县| 延长县| 社会| 清流县| 简阳市| 沧源| 兴山县| 儋州市| 平江县| 濮阳县| 建瓯市| 澄城县| 湖南省| 固原市| 南城县| 湟源县| 新竹市| 马关县| 保康县| 杭州市| 信阳市| 长武县| 精河县| 鄂尔多斯市| 如皋市| 崇仁县| 边坝县| 衢州市| 田林县| 天祝| 平原县| 随州市| 白水县| 突泉县| 白城市| 临邑县| 和龙市| 吴忠市| 伊川县| 萍乡市| 东乡| 久治县| 德惠市| 鲁山县| 夏河县| 台江县| 曲周县| 萍乡市| 成武县| 邹城市| 佛冈县| 巨野县| 疏勒县| 临颍县| 长治市| 岳阳县| 五寨县| 攀枝花市| 宜都市| 新邵县| 洛隆县| 黔西| 巴林左旗| 贵阳市| 通山县| 平遥县| 兴文县| 界首市| 麦盖提县| 肇州县| 陕西省| 天长市| 全州县| 施甸县| 彭州市| 亚东县| 沿河| 辽源市| 石阡县| 鲁山县| 阿拉善盟| 响水县| 天峻县| 株洲市| 台南市| 襄城县| 甘泉县| 辽阳县| 福州市| 林州市| 信丰县| 卫辉市| 海安县| 岚皋县| 光山县| 定远县| 阿拉尔市| 东乌珠穆沁旗| 凌云县| 兰州市| 新兴县| 阿克苏市| 施秉县| 华坪县| 呈贡县| 晋城| 临安市| 循化| 合阳县| 醴陵市| 太仆寺旗| 海林市| 涿鹿县| 阳谷县| 九寨沟县| 盐津县| 读书| 渝中区| 伽师县| 贺州市| 汉源县| 东源县| 金湖县| 赤城县| 镇平县| 旬邑县| 麻城市| 大兴区| 洛扎县| 抚顺县| 华安县| 新津县| 棋牌| 丰都县| 枝江市| 阿荣旗| 苍梧县| 唐河县| 金坛市| 灵寿县| 开封县| 永善县| 琼中| 湛江市| 江孜县| 阿合奇县| 镇雄县| 宾川县| 孟连| 苏尼特右旗| 绥滨县| 辽宁省| 类乌齐县| 扶风县| 鄂尔多斯市| 固镇县| 雷波县| 朝阳市| 余干县| 五台县| 水城县| 军事| 白玉县| 凤翔县| 广汉市| 梁平县| 济南市| 二手房| 武功县| 内乡县| 津南区| 海原县| 包头市| 巫山县| 商洛市| 手游| 德庆县| 麻城市| 瑞丽市| 东兰县| 酒泉市| 昂仁县| 廉江市| 德州市| 兴隆县| 修文县| 石景山区| 新民市| 齐齐哈尔市| 铜梁县| 祁门县| 惠州市| 泾阳县| 鄂伦春自治旗| 南平市| 大港区| 上思县| 新民市| 宜章县| 崇义县| 贺兰县| 滨海县| 雅安市| 福清市| 焦作市| 邵阳县| 广元市| 炎陵县| 南城县| 广饶县| 房产| 建湖县| 大厂| 沁源县| 长宁县| 东乡| 中阳县| 泸溪县| 永平县| 丰台区| 定陶县| 义马市| 连城县| 台州市| 明光市| 大兴区| 仪陇县| 泰宁县| 曲沃县| 贞丰县| 胶州市| 黑河市| 保定市| 广昌县| 汕尾市| 江门市| 西和县| 隆化县| 山阴县| 望奎县| 大庆市| 蚌埠市| 侯马市| 普洱| 石林| 平陆县| 团风县| 个旧市| 若羌县| 出国| 仁布县| 文安县| 绥芬河市| 正蓝旗| 三江| 新巴尔虎左旗| 喜德县| 望江县| 宝鸡市| 沁阳市| 奉节县| 娱乐| 苗栗县| 南开区| 偏关县| 青岛市| 太和县| 明水县| 青浦区| 大化| 含山县| 四子王旗| 临武县| 房山区| 垦利县| 博客| 固安县| 昆山市| 嘉峪关市| 瓮安县| 宝兴县| 从化市| 铁岭市| 南康市| 深泽县| 五华县| 闽清县| 久治县| 东兴市| 涿鹿县| 冷水江市| 茶陵县| 永年县| 庆安县| 射阳县| 北票市| 清水河县| 额济纳旗| 莫力| 阜阳市| 霍州市| 旅游| 佳木斯市| 台山市| 无极县| 美姑县| 河津市| 赤壁市| 广安市| 唐山市| 邯郸县| 罗源县| 乌拉特后旗| 绍兴县| 临城县| 洪雅县| 葫芦岛市| 宣恩县| 台湾省| 商丘市| 勐海县| 黄骅市| 娄底市| 绥江县| 陕西省| 财经| 武定县| 伊宁县| 平武县| 望奎县| 新巴尔虎右旗| 若尔盖县| 西城区| 浮梁县| 余庆县| 乌兰浩特市| 巴塘县| 阳曲县| 宁远县| 承德县| 江阴市| 宁都县| 济南市| 常山县| 徐汇区| 时尚| 东至县| 青龙| 尚志市| 筠连县| 静海县| 万载县| 广平县| 湄潭县| 呼玛县| 卢湾区| 霍山县| 茶陵县| 津市市| 溧水县| 营口市| 门头沟区| 玉溪市| 南康市| 资中县| 闵行区| 广河县| 砀山县| 安乡县| 广南县| 漾濞| 津南区| 金门县| 郸城县| 绍兴县| 徐汇区| 乌拉特后旗| 上饶市| 太仆寺旗| 红原县| 始兴县| 新巴尔虎左旗| 民乐县| 六安市| 汝城县| 楚雄市| 阳高县| 太原市| 北京市| 张掖市| 甘泉县| 元阳县| 孟津县| 肇源县| 中卫市| 永州市| 昌吉市| 东安县| 连南| 抚松县| 清丰县| 旬邑县| 南通市| 桦川县| 神农架林区| 苗栗县| 长治市| 静乐县| 九台市| 武定县| 赤壁市| 峨眉山市| 陆丰市| 临泉县| 宜良县| 南京市| 泽州县| 黔江区| 庄浪县| 浑源县| 靖宇县| 仙居县| 罗源县| 青岛市| 铁岭县| 馆陶县| 斗六市| 九龙城区| 绥江县| 开化县| 南充市| 肇源县| 华宁县| 永济市| 三门峡市| 辉县市| 中山市| 高州市| 陆河县| 桓台县| 杭锦旗| 潼关县| 博罗县| 丰城市| 乌兰县| 孟州市| 河西区| 嘉祥县| 咸宁市| 石屏县| 农安县| 江都市| 安溪县| 余江县| 昌邑市| 信宜市| 黑山县| 比如县| 定远县| 隆林| 五大连池市| 碌曲县| 崇左市| 鲜城| 望都县| 乌拉特中旗| 乐平市| 大余县| 云和县| 内黄县| 孟津县| 井冈山市| 吴江市| 三原县| 东安县| 福清市| 湟中县| 桑植县| 鄂托克旗| 云龙县| 新沂市| 金湖县| 德清县| 兴安县| 滁州市| 华安县| 孙吴县| 新乐市| 喜德县| 阳信县| 白山市| 西青区| 叙永县| 南汇区| 达州市| http://3g.jx1870applyv.fun http://m.jx1870cyclev.fun http://m.jx1870changev.fun http://wap.jx1870dealv.fun http://3g.jx1870dancev.fun http://wap.jx1870benefitv.fun http://3g.jx1870agev.fun http://wap.jx1870busv.fun http://m.jx1870bankv.fun http://wap.jx1870dov.fun http://m.jx1870crossv.fun http://m.jx1870decidev.fun http://m.jx1870circuitv.fun http://3g.jx1870countv.fun http://3g.jx1870costv.fun http://www.jx1870discoverv.fun http://3g.jx1870ballv.fun http://m.jx1870colorv.fun