<sub id="fhvtr"></sub><sub id="fhvtr"></sub>

      <address id="fhvtr"></address>

              <sub id="fhvtr"></sub>

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

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

                相关文章
                相关标签/搜索
                2020年香港开奖结果2018年香港六合马会开奖结果现场直播开奖历史资料记录在线查询网 会同县| 黄山市| 福建省| 西贡区| 乌苏市| 调兵山市| 晋江市| 祥云县| 莒南县| 镇雄县| 年辖:市辖区| 新干县| 防城港市| 常州市| 满城县| 商南县| 阳江市| 兴仁县| 米泉市| 进贤县| 吉水县| 普定县| 万荣县| 襄城县| 原阳县| 岳阳县| 海原县| 安丘市| 肥乡县| 贡山| 上林县| 北川| 临高县| 将乐县| 黄冈市| 新野县| 南川市| 杂多县| 凉山| 新疆| 福海县| 江口县| 荆州市| 漠河县| 玛曲县| 杭锦后旗| 凌海市| 威海市| 孟津县| 吉安市| 阿鲁科尔沁旗| 泽库县| 鹤庆县| 枣庄市| 澎湖县| 礼泉县| 陵水| 苗栗县| 当雄县| 鞍山市| 怀化市| 三亚市| 大安市| 邳州市| 库尔勒市| 鄂托克前旗| 华坪县| 金门县| 晋州市| 江陵县| 若羌县| 叙永县| 铜陵市| 阜新市| 四子王旗| 乐至县| 永嘉县| 金华市| 图木舒克市| 汉寿县| 道孚县| 新建县| 米泉市| 寻乌县| 千阳县| 门头沟区| 勐海县| 五峰| 兰坪| 襄汾县| 乳源| 凤山市| 天门市| 安达市| 外汇| 珠海市| 墨竹工卡县| 五华县| 门头沟区| 南靖县| 霸州市| 沙田区| 越西县| 长汀县| 板桥市| 汝城县| 昆山市| 苍溪县| 如皋市| 伊吾县| 涟源市| 称多县| 北京市| 新昌县| 噶尔县| 定襄县| 宜丰县| 博罗县| 江永县| 奈曼旗| 靖远县| 石棉县| 靖安县| 甘泉县| 海城市| 金溪县| 汉寿县| 电白县| 金昌市| 鸡泽县| 五家渠市| 安阳市| 安图县| 前郭尔| 民权县| 泽普县| 长子县| 栾川县| 都安| 湘阴县| 嵩明县| 玛曲县| 都匀市| 同仁县| 长武县| 郸城县| 石景山区| 青冈县| 壤塘县| 四子王旗| 甘孜| 长沙县| 昌吉市| 北安市| 集安市| 新乡县| 永福县| 攀枝花市| 平乡县| 岳池县| 政和县| 肥乡县| 卢氏县| 龙里县| 乌恰县| 衡水市| 达拉特旗| 五原县| 肇庆市| 忻城县| 响水县| 朔州市| 禄丰县| 雷州市| 深水埗区| 勐海县| 黔西县| 图们市| 册亨县| 台北市| 伊金霍洛旗| 江津市| 台江县| 东莞市| 武义县| 依安县| 青河县| 宁强县| 平顶山市| 清涧县| 崇阳县| 嘉义市| 博野县| 中牟县| 璧山县| 五指山市| 鄂伦春自治旗| 阿坝县| 嘉禾县| 江达县| 安化县| 衡南县| 花莲市| 汝南县| 丰原市| 永定县| 贵阳市| 通辽市| 赣榆县| 三门峡市| 秦皇岛市| 贵定县| 沾益县| 蕲春县| 河曲县| 芦山县| 蓬莱市| 金昌市| 海丰县| 彩票| 沁水县| 泸溪县| 汶川县| 德江县| 西吉县| 隆尧县| 凉山| 永修县| 安新县| 瓮安县| 恩施市| 焉耆| 股票| 景泰县| 阿拉善左旗| 阆中市| 绥江县| 囊谦县| 云林县| 巴楚县| 绥德县| 华容县| 鹤岗市| 溧阳市| 贺兰县| 嵊泗县| 沙洋县| 阳山县| 西吉县| 姜堰市| 青州市| 广德县| 乌审旗| 泸西县| 成武县| 定兴县| 富蕴县| 利川市| 措勤县| 金华市| 泸水县| 额尔古纳市| 吴忠市| 福海县| 梨树县| 邵武市| 琼海市| 炉霍县| 钟祥市| 开封市| 巢湖市| 平顶山市| 莎车县| 大田县| 瓮安县| 松原市| 上高县| 崇信县| 福州市| 广东省| 六枝特区| 翁源县| 丹巴县| 沈丘县| 进贤县| 太仆寺旗| 滕州市| 莎车县| 蒙城县| 特克斯县| 深水埗区| 天气| 富民县| 新宾| 海口市| 龙州县| 湄潭县| 吉安市| 新巴尔虎左旗| 且末县| 梁平县| 眉山市| 永福县| 高碑店市| 昌江| 秦皇岛市| 玉环县| 永仁县| 聂拉木县| 金川县| 阆中市| 荥经县| 襄城县| 利津县| 黄骅市| 东丽区| 安岳县| 柘城县| 屯门区| 繁昌县| 皋兰县| 永新县| 万安县| 宝丰县| 乃东县| 霍城县| 凤山市| 措美县| 鹰潭市| 金山区| 闻喜县| 高陵县| 桐庐县| 辽源市| 天等县| 庆云县| 南木林县| 澜沧| 正宁县| 滦平县| 辉南县| 佳木斯市| 甘洛县| 广宁县| 临安市| 郸城县| 南岸区| 杭锦后旗| 依安县| 海丰县| 关岭| 古浪县| 宣化县| 分宜县| 曲靖市| 屏山县| 陆良县| 上林县| 安阳市| 仙游县| 临城县| 越西县| 长海县| 萨迦县| 泗阳县| 临高县| 阿鲁科尔沁旗| 武冈市| 册亨县| 太保市| 屏东县| 门头沟区| 凤庆县| 定安县| 天等县| 松溪县| 昌江| 山东| 宿迁市| 太白县| 巴林右旗| 隆安县| 武邑县| 宝山区| 新密市| 仁化县| 六安市| 饶阳县| 仙居县| 溧阳市| 宝坻区| 德保县| 休宁县| 禄劝| 皋兰县| 正定县| 增城市| 财经| 江达县| 吉木萨尔县| 缙云县| 汉寿县| 温州市| 绥滨县| 无极县| 曲松县| 沙坪坝区| 杭锦旗| 同心县| 聊城市| 云林县| 克山县| 阳朔县| 广元市| 久治县| 乌恰县| 甘肃省| 民丰县| 阆中市| 古田县| 英吉沙县| 台前县| 武义县| 隆林| 白银市| 江门市| 高阳县| 会昌县| 晋宁县| 铜山县| 合川市| 平远县| 开江县| 宜都市| 乳山市| 绥中县| 库车县| 福清市| 都安| 阿拉善左旗| 宜君县| 乌兰浩特市| 乐至县| 巴林右旗| 安平县| 左云县| 曲沃县| 综艺| 公安县| 柘荣县| 郎溪县| 准格尔旗| 商南县| 铜鼓县| 华池县| 平乡县| 汝州市| 精河县| 陈巴尔虎旗| 罗田县| 赤城县| 金坛市| 崇仁县| 抚州市| 广昌县| 胶南市| 金华市| 商河县| 巨鹿县| 临泽县| 唐河县| 苏尼特右旗| 安西县| 洞头县| 松溪县| 东莞市| 嘉峪关市| 嘉荫县| 卢龙县| 高雄县| 筠连县| 麻城市| 聊城市| 镇赉县| 昔阳县| 罗平县| 如皋市| 桐梓县| 平湖市| 康定县| 山西省| 德州市| 凤山县| 广汉市| 双峰县| 贵州省| 盈江县| 乡城县| 宜阳县| 民乐县| 莱芜市| 庄浪县| 克山县| 潞西市| 陵川县| 株洲市| 黄陵县| 巨鹿县| 精河县| 唐山市| 泽普县| 黑水县| 武城县| 尤溪县| 左权县| 邵阳市| 石林| 延庆县| 渝中区| 运城市| 新宁县| 湟源县| 同江市| 马关县| 礼泉县| 宝兴县| 名山县| 高青县| 舟山市| 津南区| 福海县| 日土县| 东至县| 成都市| 彩票| 清徐县| 柘荣县| 桑植县| 万州区| 扬州市| 定陶县| 随州市| 德安县| 信丰县| 万荣县| 阿拉尔市| 乡城县| 平江县| 任丘市| 夏邑县| 镇远县| 深州市| 杭州市| 蓬安县| 宁南县| 得荣县| 刚察县| 昌江| 铜梁县| 新野县| 额济纳旗| 秀山| 安图县| 凭祥市| 台湾省| 乐平市| 新乡县| 华宁县| 合作市| 喀什市| 沧源| 遵义市| 富民县| 西畴县| 合水县| 南丹县| 肇州县| 昆山市| 阿勒泰市| 大渡口区| 伊川县| 景宁| 长汀县| 靖边县| 博客| 高雄县| 沙河市| 交口县| 收藏| 华阴市| 昌宁县| 华蓥市| 兰考县| 梅州市| 辉县市| 莒南县| 彩票| 武宁县| 台山市| 东光县| 河南省| 长顺县| 易门县| 景洪市| 富民县| 南江县| 仲巴县| 綦江县| 沂源县| 翁牛特旗| 广安市| 舒城县| 永昌县| 遂平县| 贵定县| http://wap.jx1870agreev.fun http://www.jx1870considerv.fun http://wap.jx1870conflictv.fun http://m.jx1870affectv.fun http://www.jx1870dreazv.fun http://m.jx1870encouragev.fun http://m.jx1870apparelv.fun http://3g.jx1870chancev.fun http://wap.jx1870appropriatev.fun http://m.jx1870conflictv.fun http://wap.jx1870borderv.fun http://m.jx1870catchv.fun http://3g.jx1870calendarv.fun http://wap.jx1870appropriatev.fun http://www.jx1870correctv.fun http://m.jx1870cozpletev.fun http://3g.jx1870depositv.fun http://wap.jx1870billv.fun