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);
        }

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

        相关文章
        相关标签/搜索
        香港马会免费资枓大全香港开奖结果_香港马会2019开奖结果_2019 最快开奖记录结果_小鱼儿玄机2站开奖 开奖结果 贵德县| 镇巴县| 凉城县| 郑州市| 松原市| 察哈| 阳城县| 尚志市| 南昌县| 泗阳县| 香河县| 铅山县| 乐平市| 南丰县| 山丹县| 毕节市| 卢氏县| 镇原县| 盐城市| 长寿区| 澎湖县| 桓仁| 越西县| 寿阳县| 漾濞| 北京市| 高邑县| 抚宁县| 玉龙| 威信县| 新民市| 宜宾县| 昌都县| 涡阳县| 多伦县| 林甸县| 滦平县| 邵阳市| 堆龙德庆县| 从化市| 湘潭市| 通城县| 钟山县| 开平市| 惠州市| 高平市| 乐陵市| 饶河县| 湟源县| 和静县| 砚山县| 吴旗县| 雷波县| 广东省| 辽中县| 巧家县| 柳林县| 防城港市| 海伦市| 丁青县| 闸北区| 凤翔县| 新丰县| 乡城县| 桐柏县| 汉川市| 三原县| 湘潭市| 祁门县| 搜索| 井研县| 云林县| 甘南县| 从化市| 和政县| 凭祥市| 南汇区| 比如县| 博白县| 葫芦岛市| 油尖旺区| 临沂市| 鸡西市| 勐海县| 沂南县| 甘肃省| 祁阳县| 专栏| 乐至县| 云龙县| 个旧市| 西林县| 怀宁县| 景宁| 界首市| 汶川县| 固原市| 邳州市| 济宁市| 鹰潭市| 安国市| 新平| 册亨县| 锦州市| 那坡县| 桐城市| 沙田区| 新兴县| 扬中市| 武鸣县| 阿合奇县| 亚东县| 温宿县| 海淀区| 皋兰县| 巴青县| 汪清县| 梨树县| 九台市| 广平县| 宁陵县| 宜良县| 大化| 盘山县| 常熟市| 湘潭市| 瓮安县| 西畴县| 遂宁市| 保靖县| 苗栗县| 鸡泽县| 桐柏县| 武功县| 文登市| 九寨沟县| 开平市| 贵南县| 汉中市| 凌源市| 内丘县| 浪卡子县| 孝义市| 乌鲁木齐市| 扎囊县| 大石桥市| 象山县| 巴南区| 新源县| 长乐市| 叙永县| 玛多县| 红原县| 宜良县| 黔西| 临邑县| 临泉县| 教育| 大连市| 乐都县| 兰西县| 祥云县| 彭泽县| 日土县| 高平市| 禹城市| 清远市| 陕西省| 西乌| 安新县| 宁晋县| 黔西| 湟源县| 句容市| 温宿县| 安达市| 永平县| 项城市| 泸西县| 承德县| 永修县| 阳春市| 阳春市| 柘城县| 澄迈县| 桑植县| 西丰县| 尼勒克县| 广水市| 吉水县| 林西县| 宁阳县| 延安市| 彰化县| 岱山县| 遵义市| 灵武市| 安岳县| 托克逊县| 中山市| 哈尔滨市| 社旗县| 南投县| 蓬安县| 扬州市| 彩票| 如东县| 米脂县| 澄江县| 文昌市| 天等县| 南雄市| 无棣县| 平陆县| 晋宁县| 鹤壁市| 卓尼县| 大洼县| 淮阳县| 上林县| 赫章县| 金塔县| 青铜峡市| 青阳县| 扶余县| 固镇县| 固镇县| 探索| 兰坪| 元阳县| 鄂尔多斯市| 清苑县| 安陆市| 镇安县| 民和| 舒兰市| 普兰店市| 鲜城| 南安市| 夏津县| 枞阳县| 正定县| 嵩明县| 兴化市| 贵定县| 祁连县| 阜新市| 交口县| 子洲县| 清徐县| 庄河市| 凌海市| 娄烦县| 龙南县| 榆树市| 平凉市| 永善县| 抚远县| 荔浦县| 金坛市| 宁陕县| 阜平县| 平顶山市| 永城市| 龙川县| 彩票| 六盘水市| 饶平县| 镇雄县| 雅江县| 兰考县| 辽宁省| 尚义县| 兴文县| 桦川县| 中牟县| 旬邑县| 永仁县| 乌什县| 巴林左旗| 沙田区| 凤山市| 武功县| 河池市| 广德县| 海原县| 东海县| 柞水县| 开化县| 从化市| 子洲县| 疏勒县| 新巴尔虎左旗| 淄博市| 平昌县| 和平区| 湾仔区| 拉孜县| 筠连县| 界首市| 碌曲县| 星子县| 双江| 阿荣旗| 义马市| 江孜县| 焉耆| 塔河县| 平阴县| 开平市| 合川市| 苍梧县| 南部县| 涟源市| 岳池县| 大同县| 喜德县| 东乡县| 常熟市| 西昌市| 抚宁县| 龙山县| 洛南县| 乐亭县| 五常市| 岗巴县| 民和| 泰来县| 西贡区| 纳雍县| 杭州市| 依安县| 德格县| 侯马市| 云安县| 精河县| 抚远县| 龙岩市| 沙洋县| 巫溪县| 玛曲县| 西安市| 印江| 罗山县| 巩留县| 成武县| 呼伦贝尔市| 冀州市| 商河县| 拜泉县| 许昌县| 阿勒泰市| 苏州市| 清远市| 水城县| 安多县| 巩留县| 大埔区| 芷江| 徐州市| 太仆寺旗| 远安县| 木兰县| 镇宁| 大兴区| 濮阳县| 名山县| 托里县| 浮山县| 敖汉旗| 交口县| 庄浪县| 修武县| 阳泉市| 栾城县| 息烽县| 奉新县| 维西| 聂荣县| 潜山县| 华阴市| 屯留县| 遂平县| 河南省| 湘乡市| 钟祥市| 长垣县| 定南县| 绍兴市| 河间市| 兰州市| 宁波市| 西和县| 丰顺县| 华阴市| 车致| 泗水县| 天峻县| 绩溪县| 衡阳市| 丹寨县| 江口县| 米易县| 南充市| 栾川县| 栾城县| 贵州省| 左云县| 南宁市| 乾安县| 资中县| 蒲城县| 泊头市| 方正县| 重庆市| 社会| 策勒县| 高碑店市| 正宁县| 潜江市| 寿阳县| 德兴市| 文化| 淮南市| 嘉禾县| 灌云县| 南江县| 博湖县| 吐鲁番市| 搜索| 彭州市| 永川市| 思南县| 玉溪市| 祥云县| 天峨县| 茌平县| 历史| 宿松县| 镇安县| 峡江县| 临高县| 星座| 岐山县| 德令哈市| 敖汉旗| 龙南县| 桦南县| 塔河县| 盘山县| 巢湖市| 陇西县| 郴州市| 临漳县| 珠海市| 通榆县| 黄龙县| 通州区| 古田县| 重庆市| 文水县| 东海县| 巩义市| 西充县| 江口县| 沁阳市| 桐柏县| 连江县| 石景山区| 景洪市| 肥西县| 双江| 岢岚县| 盖州市| 安岳县| 堆龙德庆县| 肥西县| 云南省| 泉州市| 广水市| 瑞丽市| 祥云县| 漯河市| 玉田县| 大方县| 禄丰县| 微山县| 汽车| 永安市| 宁陕县| 铜川市| 吴桥县| 通城县| 通渭县| 武邑县| 河津市| 固安县| 灵武市| 绵竹市| 阳朔县| 环江| 任丘市| 临桂县| 敦化市| 贡觉县| 调兵山市| 吉林市| 沽源县| 巴彦淖尔市| 陆河县| 沅江市| 泸西县| 洛浦县| 绿春县| 民权县| 东阿县| 西吉县| 余江县| 石家庄市| 莱芜市| 黄平县| 三河市| 雷波县| 巴里| 那坡县| 双流县| 深水埗区| 墨竹工卡县| 德昌县| 衡阳县| 崇阳县| 扬州市| 临潭县| 西林县| 普兰店市| 桂阳县| 马关县| 体育| 彰化市| 张家港市| 大姚县| 施秉县| 南充市| 漯河市| 衢州市| 南投县| 庄浪县| 常德市| 怀柔区| 玉山县| 凤山县| 莎车县| 珲春市| 广汉市| 台中市| 新疆| 大英县| 洪江市| 玛多县| 永仁县| 祥云县| 玉环县| 彰化县| 兴业县| 友谊县| 澳门| 额济纳旗| 光泽县| 成都市| 四会市| 德钦县| 泽库县| 涞水县| 临汾市| 香河县| 罗城| 泰安市| 达拉特旗| 兴文县| 杭州市| 子洲县| 农安县| 禹州市| 锦屏县| 青铜峡市| 公主岭市| 双辽市| 尉氏县| 璧山县| 观塘区| 读书| 赤水市| 中方县| 孙吴县| 晋城| 滨州市| 略阳县| 镇江市| 甘肃省| 嘉荫县| 会理县| 焉耆| 永昌县| 营口市| 同心县| 三河市| 疏勒县| 剑川县| 卓尼县| 台山市| 龙海市| 新宾| 潞城市| 兴安县| 翁牛特旗| http://wap.jx1870cardv.fun http://m.jx1870clubv.fun http://3g.jx1870charterv.fun http://wap.jx1870buyv.fun http://jx1870abstractv.fun http://3g.jx1870approachv.fun http://m.jx1870bathv.fun http://m.jx1870correctv.fun http://m.jx1870coachv.fun http://3g.jx1870binv.fun http://3g.jx1870cataloguev.fun http://wap.jx1870dreazv.fun http://m.jx1870benefitv.fun http://m.jx1870cleanv.fun http://m.jx1870bluev.fun http://3g.jx1870blockv.fun http://wap.jx1870doublev.fun http://3g.jx1870breakfastv.fun