zoukankan      html  css  js  c++  java
  • POJ1840: Eqs(hash问题)

    一道典型的hash问题:

    已知a1,a2,a3,a4,a5,求有多少种不同的<x1,x2,x3,x4,x5>组合满足等式:

    a1*x1^3 + a2*x2^3 + a3*x3^3 + a4*x4^3 + a5*x5^3 = 0

    一种做法是暴力枚举,但因为xi∈[-50,-1)(1,50],所以暴力枚举时间为O(100^5),显然不可行。

    所以只能用hash方法:

    我们可以讲前两项 a1*x1^3 + a2*x2^3 的所有可能多项式结果SUM运算出来,并将这些SUM映射到hash表上。因为可能存在不同的<x1,x2>元组,但他们的SUM相同,会映射到hash表上相同的indice上,对于这种情况,我们采用hash[<x1,x2>::SUM]++的处理方式,最终hash表上所有indice上hash值不为0的值相加就是前两项所有可能的SUM。同时,因为存在运算结果为负值的情况,(因为ai, xi都∈[-50,-1)(1,50],所以前两项的SUM∈[-12500000,12500000]。为了不让映射的下标为负数,当SUM>=0时,KEY=SUM;当SUM<0时,KEY=SUM+12500000. 同时为了保证所有可能的SUM都能够hash到表上的indice,hash数组的规模需开到25000001.

    --------------------------------------------------------------------------------------

    然后我们继续枚举下面三项a3*x3^3 + a4*x4^3 + a5*x5^3 的所有可能SUM并求出KEY,

    KEY一样采用上面的做法:当SUM>=0时,KEY=SUM;当SUM<0时,KEY=SUM+12500000.

    当我们用(-KEY)去查hash表时,如果hash[0-KEY]>0,说明hash表上有记录,也意味着当前枚举的三元组<x3,x4,x5>找到了一个<x1,x2>使得整体的SUM=0,即找到一个方程的解。统计解的个数即为最终结果。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<map>
     6 #include<vector>
     7 using namespace std;
     8 const int max_size=25000010;
     9 short hsh[max_size];
    10 int a1,a2,a3,a4,a5,ans;
    11 int main(){
    12     scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
    13     ans=0;
    14     memset(hsh,0,sizeof(hsh));
    15     for(int i=-50;i<=50;i++){
    16         if(!i) continue;
    17         for(int j=-50;j<=50;j++){
    18             if(!j) continue;
    19             int sum=0;
    20             for(int k=-50;k<=50;k++){
    21                 if(!k) continue;
    22                 sum=(-1)*(i*i*i*a1+j*j*j*a2+k*k*k*a3);
    23                 if(sum<0) sum+=max_size;
    24                 hsh[sum]++;
    25             }
    26         }
    27     }
    28     for(int i=-50;i<=50;i++){
    29         if(!i) continue;
    30         int sum=0;
    31         for(int j=-50;j<=50;j++){
    32             if(!j) continue;
    33             sum=i*i*i*a4+j*j*j*a5;
    34             if(sum<0) sum+=max_size;
    35             if(hsh[sum]) ans+=hsh[sum];
    36         }
    37     }
    38     printf("%d
    ",ans);
    39 }
    View Code
  • 相关阅读:
    Windows 无法启动xx服务 错误1053:服务没有及时响应启动或控制请求
    Nginx之解压编译安装-yellowcong
    SqlServer中的数据类型UniqueIdentifier
    Android利用Volley异步载入数据完整具体演示样例(二)
    蓝桥杯——历年真题之带分数
    联想教育应用使用说明(7.6版本号)——第4章 网络控制工具的使用
    oracle入门学习笔记
    Asp.Net实现JS前台带箭头的流程图方法总结!(个人笔记,信息不全)
    到底什么是RPC?
    Codeforces Round #336 (Div. 2) 608C Chain Reaction(dp)
  • 原文地址:https://www.cnblogs.com/fu11211129/p/4211781.html
Copyright © 2011-2022 走看看