POJ1840: Eqs(hash问题)
2015-01-08 19:36
381 查看
一道典型的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,即找到一个方程的解。统计解的个数即为最终结果。
[b]View Code[/b]
已知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,即找到一个方程的解。统计解的个数即为最终结果。
[b] 1 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<map> #include<vector> using namespace std; const int max_size=25000010; short hsh[max_size]; int a1,a2,a3,a4,a5,ans; int main(){ scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5); ans=0; memset(hsh,0,sizeof(hsh)); for(int i=-50;i<=50;i++){ if(!i) continue; for(int j=-50;j<=50;j++){ if(!j) continue; int sum=0; for(int k=-50;k<=50;k++){ if(!k) continue; sum=(-1)*(i*i*i*a1+j*j*j*a2+k*k*k*a3); if(sum<0) sum+=max_size; hsh[sum]++; } } } for(int i=-50;i<=50;i++){ if(!i) continue; int sum=0; for(int j=-50;j<=50;j++){ if(!j) continue; sum=i*i*i*a4+j*j*j*a5; if(sum<0) sum+=max_size; if(hsh[sum]) ans+=hsh[sum]; } } printf("%d\n",ans); }[/b]
[b]View Code[/b]
相关文章推荐
- POJ 1840 Eqs(枚举+HASH)
- poj 1840 Eqs , hash
- poj 1840 Eqs 【hash】
- HDU-1496-Equations && POJ-1840-Eqs (hash)
- poj 1840 Eqs (hash)
- POJ-1840 Eqs Hash
- POJ 1840 Eqs 二分+map/hash
- [POJ 1840]Eqs[hash][枚举]
- POJ 1840 Eqs(hash)
- hdu 题目1496 Equations , POJ 题目1840 Eqs (整数Hash)
- POJ题目1840 Eqs(hash)
- POJ 1840 Eqs(hash)
- POJ-1840 Eqs【Hash】
- HDU_1496 Equations && POJ_1840 Eqs(Hash)
- poj-1840 Eqs(hash)
- Poj 1840 Eqs(Hash)
- POJ 1840 Eqs hash
- poj 1840 Eqs (Hash)
- POJ 1840 Eqs (Hash)
- poj 1840 Eqs(Hash)