Equations
http://acm.hdu.edu.cn/showproblem.php?pid=1496
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1886 Accepted Submission(s): 717
a*x1^2+b*x2^2+c*x3^2+d*x4^2=0
a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0.
It is consider a solution a system ( x1,x2,x3,x4 ) that verifies the equation, xi is an integer from [-100,100] and xi != 0, any i ∈{1,2,3,4}.
Determine how many solutions satisfy the given equation.
End of file.
//先求出a*x1*x1+b*x2*x2所有的值保存在hash表中,然後查找-(c*x3*x3+d*x4*x4)是否存在hash表中
//注意輸出時需要乘上2^4
#include<iostream>
#include<cstring>
using namespace std;
int hash[2000050];
int main(){
int a,b,c,d,x1,x2,x3,x4,num;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
if( (a>0&&b>0&&c>0&&d>0) || ( a<0&&b<0&&c<0&&d<0) ){
printf("0\n");
continue;
}
memset(hash,0,sizeof(hash));
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
hash[1000000+a*i*i+b*j*j]++;
num=0;
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
num+=hash[1000000+(-c*i*i-d*j*j)];
printf("%d\n",num*16);
}
return 0;
}
上面的代碼有點浪費空間,百度了一個代碼,挺好的,如下:
#include<iostream>
using namespace std;
const int MAXN=20021; //ax1^2+bx2^2 和 cx3^2+dx4^2分別最多有10000種可能
int hash[MAXN],counter[MAXN];
//確定在哈希表中的位置,處理衝突
int hash_find(int num){
int t;
t=num%MAXN;
if(t<0)
t+=MAXN;
while(counter[t]&&hash[t]!=num) //當哈希表內已保存數並且該數不是num
t=(t+1)%MAXN;
return t;
}
int main(){
int a,b,c,d,i,j,ans,t;
int num,square[101];
for(i=1;i<=100;i++)
square[i]=i*i;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
if((a>0&&b>0&&c>0&&d>0) || (a<0&&b<0&&c<0&&d<0)){
printf("0\n");
continue;
}
memset(counter,0,sizeof(counter));
for(i=1;i<=100;i++)
for(j=1;j<=100;j++){
num=a*square[i]+b*square[j];
t=hash_find(num);
hash[t]=num;
counter[t]++;
}
ans=0;
for(i=1;i<=100;i++)
for(j=1;j<=100;j++){
num=-(c*square[i]+d*square[j]);
t=hash_find(num);
ans+=counter[t];
}
ans*=16; //x1,x2,x3,x4不同的正負
printf("%d\n",ans);
}
return 0;
}