题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1496
传统方法:四重循环,复杂度高
可行方案:两重循环+Hash存储查找
注意:使用Hash时,必须注意冲突的处理
#include<iostream>
#include<memory>
using namespace std;
#define MAX 50021
int f[MAX],g[MAX];
int Hash(int k)
{
int t = k%MAX;
if(t<0)
t+=MAX;
while(f[t]!=0&&g[t]!=k)
t = (t+1)%MAX;
return t;
}
int main()
{
int a,b,c,d;
int i,j,s,t,ans,v[101];
for(i=1;i<=100;i++)
v[i]=i*i;
while(cin>>a>>b>>c>>d)
{
ans=0;
if((a>0&&b>0&&c>0&&d>0)||(a<0&&b<0&&c<0&&d<0))
{
cout<<"0"<<endl;
continue;
}
memset(f,0,sizeof(f));
for(i=1;i<=100;i++)
{
for(j=1;j<=100;j++)
{
s=a*v[i]+b*v[j];
t=Hash(s);
g[t]=s;
f[t]++;
}
}
for(i=1;i<=100;i++)
{
for(j=1;j<=100;j++)
{
s=-(c*v[i]+d*v[j]);
t=Hash(s);
ans+=f[t];
}
}
cout<<ans*16<<endl;
}
return 0;
}