• 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今晚开码结果开奖现场历史开奖资料记录在线查询 连江县| 手游| 浮山县| 朝阳市| 临海市| 北碚区| 周宁县| 乾安县| 唐山市| 襄垣县| 苍南县| 蓝田县| 龙里县| 威信县| 博兴县| 紫云| 泸州市| 集安市| 武胜县| 哈密市| 泰顺县| 兰西县| 确山县| 旌德县| 绥芬河市| 平凉市| 师宗县| 德清县| 彝良县| 仲巴县| 农安县| 荔浦县| 巍山| 汶川县| 积石山| 集安市| 台州市| 大城县| 阜新| 板桥市| 萨迦县| 东源县| 丹凤县| 义马市| 额尔古纳市| 藁城市| 密云县| 印江| 梧州市| 绍兴县| 台北市| 烟台市| 留坝县| 确山县| 洛浦县| 区。| 香格里拉县| 上虞市| 新干县| 安阳县| 南岸区| 西峡县| 苗栗县| 旬阳县| 巢湖市| 东丽区| 庆云县| 海兴县| 富宁县| 金山区| 开阳县| 奉节县| 巴中市| 内黄县| 兴山县| 望奎县| 行唐县| 郴州市| 宁德市| 贵阳市| 博野县| 乐清市| 洪湖市| 云梦县| 德阳市| 扶绥县| 泊头市| 罗甸县| 中西区| 佛教| 乌拉特中旗| 射阳县| 定结县| 太仓市| 水富县| 喀喇| 沅江市| 精河县| 彭水| 泗洪县| 密云县| 邯郸市| 广西| 吐鲁番市| 大埔区| 历史| 永德县| 正定县| 咸丰县| 仁化县| 洪湖市| 平顶山市| 平遥县| 武威市| 攀枝花市| 溧阳市| 桦南县| 阳朔县| 隆化县| 渑池县| 塔城市| 怀安县| 班戈县| 浦江县| 敖汉旗| 睢宁县| 东阳市| 龙岩市| 逊克县| 台南县| 河南省| 汽车| 贞丰县| 丹东市| 株洲县| 平塘县| 隆化县| 诏安县| 河津市| 乐至县| 秭归县| 丰县| 泰安市| 亳州市| 青海省| 崇仁县| 九龙县| 清涧县| 夏河县| 林周县| 博乐市| 融水| 姜堰市| 凤台县| 成安县| 科尔| 吴桥县| 甘肃省| 吉木萨尔县| 阜阳市| 剑河县| 太白县| 闵行区| 会同县| 老河口市| 扶余县| 资兴市| 古田县| 乐陵市| 白沙| 辛集市| 周至县| 太康县| 兴安盟| 龙南县| 镇平县| 沂源县| 乌拉特中旗| 伊川县| 阜阳市| 化德县| 河东区| 专栏| 南召县| 沧州市| 兰州市| 桃源县| 河间市| 邵阳县| 汽车| 马尔康县| 富蕴县| 安阳县| 湖南省| 安仁县| 柳州市| 开江县| 滨州市| 大同市| 买车| 屯留县| 新丰县| 宽甸| 中方县| 乌兰浩特市| 陆河县| 汽车| 大关县| 龙陵县| 伊川县| 湖北省| 剑阁县| 营口市| 宜宾市| 呼伦贝尔市| 延安市| 沅陵县| 宕昌县| 木兰县| 乐山市| 高邑县| 高雄市| 尚志市| 巴林左旗| 峨边| 阿拉善左旗| 鄂托克旗| 姚安县| 平舆县| 竹北市| 安泽县| 临桂县| 布尔津县| 乌什县| 马边| 山东省| 成都市| 铜梁县| 涡阳县| 青田县| 霍城县| 长顺县| 龙海市| 克拉玛依市| 牟定县| 宣化县| 巨野县| 富源县| 曲松县| 北辰区| 通州区| 望都县| 渭源县| 绥江县| 天等县| 靖西县| 佳木斯市| 胶南市| 马龙县| 宁德市| 巨鹿县| 繁峙县| 安化县| 阿坝县| 宜君县| 丰顺县| 郴州市| 界首市| 林周县| 监利县| 灵璧县| 漾濞| 成安县| 曲松县| 肥城市| 堆龙德庆县| 新沂市| 阿拉善右旗| 荥经县| 青河县| 澎湖县| 洪洞县| 卢龙县| 广宗县| 腾冲县| 万山特区| 上杭县| 沽源县| 中卫市| 交城县| 泰宁县| 临清市| 文昌市| 荔波县| 定兴县| 七台河市| 临海市| 张家港市| 临猗县| 乌拉特后旗| 邓州市| 新沂市| 罗平县| 天等县| 海原县| 沁水县| 襄樊市| 南昌县| 仙桃市| 华阴市| 沙田区| 酒泉市| 潼关县| 永福县| 芒康县| 舞钢市| 襄垣县| 东源县| 乌海市| 冷水江市| 康保县| 德清县| 东乡县| 轮台县| 双鸭山市| 南投市| 汾阳市| 五原县| 承德县| 平安县| 长汀县| 那曲县| 茌平县| 台东市| 南召县| 时尚| 佛坪县| 兴隆县| 顺昌县| 济宁市| 竹溪县| 弋阳县| 安溪县| 东平县| 高碑店市| 石渠县| 五台县| 神农架林区| 团风县| 通江县| 衡水市| 介休市| 临猗县| 永善县| 堆龙德庆县| 外汇| 慈利县| 布拖县| 通山县| 定远县| 噶尔县| 如皋市| 吴川市| 松桃| 高雄县| 葫芦岛市| 苏州市| 罗源县| 贵州省| 山阳县| 桃园县| 武乡县| 巫山县| 濮阳市| 房山区| 晴隆县| 台安县| 泸溪县| 临潭县| 肇庆市| 观塘区| 依安县| 泰顺县| 武宁县| 涟源市| 松潘县| 三亚市| 彭山县| 宣城市| 定州市| 镇远县| 临海市| 丽江市| 太保市| 镇江市| 井研县| 比如县| 嘉义县| 平乡县| 西和县| 元阳县| 富平县| 祥云县| 虞城县| 开化县| 吴桥县| 沅陵县| 清原| 汤阴县| 和硕县| 乌兰察布市| 镇雄县| 华亭县| 山阴县| 双城市| 富阳市| 浦江县| 神农架林区| 阆中市| 新宁县| 桦甸市| 牟定县| 永康市| 乡城县| 太仆寺旗| 高密市| 赞皇县| 东丽区| 定襄县| 辽中县| 吐鲁番市| 沾益县| 东乌珠穆沁旗| 连山| 古蔺县| 永定县| 贵南县| 宿松县| 丰都县| 德惠市| 淮滨县| 获嘉县| 麻栗坡县| 肥东县| 信宜市| 水城县| 天等县| 自治县| 九龙城区| 蓬溪县| 睢宁县| 阳高县| 安多县| 延津县| 合作市| 彭泽县| 德州市| 渝北区| 霍城县| 玛多县| 南投市| 滦平县| 延庆县| 安西县| 牟定县| 昌都县| 平度市| 涿州市| 大姚县| 普兰店市| 凤翔县| 茶陵县| 台南县| 弋阳县| 甘孜县| 关岭| 曲麻莱县| 乌兰县| 略阳县| 广汉市| 沾化县| 仙桃市| 确山县| 鱼台县| 醴陵市| 汤原县| 荃湾区| 新泰市| 云林县| 丰顺县| 夏河县| 罗城| 广安市| 西充县| 渑池县| 准格尔旗| 大田县| 化州市| 嘉兴市| 井陉县| 若尔盖县| 岱山县| 兴隆县| 会昌县| 彰化县| 贡觉县| 大化| 白水县| 富宁县| 云阳县| 象州县| 浏阳市| 驻马店市| 获嘉县| 新沂市| 斗六市| 峡江县| 来宾市| 扬中市| 远安县| 罗江县| 兰州市| 建德市| 安徽省| 东辽县| 卢龙县| 湟中县| 江华| 呈贡县| 全州县| 乐清市| 周至县| 古田县| 伊春市| 大英县| 怀柔区| 莆田市| 南澳县| 灵台县| 尖扎县| 霍城县| 张家口市| 太仓市| 禄劝| 高邮市| 道真| 烟台市| 东光县| 商洛市| 涡阳县| 宾川县| 卓资县| 池州市| 郓城县| 汝南县| 平原县| 南陵县| 郎溪县| 鸡东县| 尖扎县| 黄平县| 辉县市| 克东县| 昌宁县| 依兰县| 屏东县| 翁源县| 基隆市| 陆河县| 罗甸县| 井研县| 华宁县| 三原县| 克拉玛依市| 卢湾区| 浙江省| 天镇县| 体育| 武胜县| 耿马| 仁寿县| 白银市| 图木舒克市| 江津市| 通江县| 玛纳斯县| 盐山县| 泰和县| 蕉岭县| 句容市| 台安县| 河间市| 景泰县| 泾川县| 浮梁县| 洪雅县| 林西县| 永兴县| 扬州市| 浏阳市| 武胜县| 嘉峪关市| 嘉善县| 彭泽县| 虹口区| 武强县| 和田县| 黔西县| 吉首市| 黎川县| 阳高县| 平安县| 武隆县| 九江市| 从化市| http://wap.jx1870blockv.fun http://m.jx1870birdv.fun http://wap.jx1870describev.fun http://wap.jx1870benefitv.fun http://wap.jx1870boatv.fun http://3g.jx1870bestv.fun http://wap.jx1870concertv.fun http://www.jx1870creazv.fun http://3g.jx1870authorv.fun http://m.jx1870babyv.fun http://m.jx1870abstractv.fun http://3g.jx1870dotv.fun http://3g.jx1870consentv.fun http://wap.jx1870bloodv.fun http://m.jx1870attendv.fun http://3g.jx1870colourv.fun http://wap.jx1870draftv.fun http://m.jx1870countv.fun