如果写成四重循环的程序,肯定会超时。这道题目给了我们 a,b,c,d 四个系数,而未知数却又四个,因此常规得暴力枚举写法会有四重循环。hash的处理即使将四个未知数拆成两部分,进行hash ,将两个未知数通过二维数组下标映射到一个唯一物理内存,这片区域即是一半方程式的值,此时只要做一个减法就可了,a+ b= 0, 得到 b= 0- a; 还是用数组来快速定位。
代码如下
#include<stdio.h>
#include<string.h>
using namespace std;
int hash[2000005];
int main(){
int a,b,c,d;
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[a*i*i+b*j*j+1000000]++;//因为最大的数是50*100*100+50*100*100等于1000000,所以加上1000000以防数组越界;
}
}
int sum=0;
for(int i=1;i<=100;i++){
for(int j=1;j<=100;j++){
sum+=hash[1000000-c*i*i-d*j*j];
}
}
printf("%d\n",sum*16);//由于解的平方一定为正数,可以只枚举解为正数的情况,然后每一个解都对应一正一负两个数,四个解一共可以有16种情况,所有在最后结果中乘上16;
}
return 0;
}