#include<stdio.h>
#include<string.h>
const int N(1000000);
int hash[N],flag[N];
int Hash(int k)
{
int p=k%N;
if(p<0)
p+=N;
while(flag[p]&&hash[p]!=k)
p=(p+1)%N;
return p;
}
int main()
{
int a,b,c,d;
while(~scanf("%d%d%d%d",&a,&b,&c,&d))
{
if(a>0&&b>0&&c>0&&d>0||(a<0&&b<0&&c<0&&d<0))
{
puts("0");
continue;
}
int cnt=0;
memset(flag,0,sizeof(flag));
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
{
int t=a*i*i+b*j*j;
int p=Hash(t);
hash[p]=t;
flag[p]++;//flag保存hash值为t的个数,因为不同的a、b也能产生相同的hash值
}
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
{
int p=Hash(-(c*i*i+d*j*j));
if(flag[p])
cnt+=flag[p];
}
printf("%d\n",cnt<<4);//因为为i、j都是从1~100而不包含-100~-1,所以每个a、b、c、d都有两种情况,所以要乘以16
}
return 0;
}
hdu 1496 Equations(hash备忘)
最新推荐文章于 2018-06-05 10:19:00 发布