看到这题首先想到的是四重for循环,肯定超时,但还是很想试一下,结果和预期一样;然后就换成三重循环,结果还是超时;最后就换成 hash求解(第一次接触)两重循环。由题意可得a*x1*x1+b*x2*x2=-(c*x3*x3+d*x4*x4)才满足条件,hash数组至少开200W (因为50 * 100 *100+50 *100 *100=100W).
如果有兴趣了解hash可以访问
- #include<cstdio>
- #include<cstring>
- const int maxn=2000000+10;
- int hash[maxn];
- int t[100+5]; //用于储存i=1~100 ,i*i的值
- int main(){
- int a,b,c,d;
- for(int i=1;i<=100;i++)t[i]=i*i;
- while(scanf("%d%d%d%d",&a,&b,&c,&d)==4){
- if(a>0 && b>0 &&c>0 && d>0 ||a<0 &&b<0 &&c<0 &&d<0)printf("0\n"); //全小于0 或全大于0 输出0
- else {
- int count=0;
- memset(hash,0,sizeof(hash));
- for(int i=1;i<=100;i++)
- for(int j=1;j<=100;j++)
- hash[1000000+a*t[i]+b*t[j]]++;
- for(int i=1;i<=100;i++)
- for(int j=1;j<=100;j++)
- count+=hash[1000000-(c*t[i]+d*t[j])];
- printf("%d\n",16*count); //因为每个xi都有两个值(正,负),所以共有2的4次方16倍
- }
- }
- return 0;
- }