#include<iostream>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;
#define mem(a) memset(a,0,sizeof(a))
#define three(a) a*a*a
const int maxn=1030302;
const int mod=100007; //这块取不同值时间不一样,这个是目前我测试最快的一个数。
//所以说哈希很大程度也跟运气哟有关。
int sum[maxn+5],index,hashtable[mod+5],next[maxn+5];
void init()
{
mem(sum);
mem(hashtable);
mem(next);
index=1;
}
void inserthash(int num)
{
int numm=num>0?num:-num;
int h=(numm%mod+numm/mod)%mod;
sum[index]=num;
next[index]=hashtable[h];
hashtable[h]=index++;
}
int if_find(int num)
{
int cnt=0;
int numm=num>0?num:-num;
int h=(numm%mod+numm/mod)%mod;
int u=hashtable[h];
while(u)
{
if(sum[u]==num)
cnt++;
u=next[u];
}
return cnt;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
int a[5];
while(~scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4]))
{
init();
int cnt=0;
for(int i=-50;i<=50;i++)if(i!=0)
for(int j=-50;j<=50;j++)if(j!=0)
for(int k=-50;k<=50;k++)if(k!=0)
inserthash(a[0]*three(i)+a[1]*three(j)+a[2]*three(k));
for(int i=-50;i<=50;i++)if(i!=0)
for(int j=-50;j<=50;j++)if(j!=0)
cnt+=if_find(-a[3]*three(i)-a[4]*three(j));
printf("%d\n",cnt);
}
return 0;
}
POJ 1840 (分离链接法)哈希
最新推荐文章于 2021-10-05 20:45:04 发布