题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1496
思路:一开始没想到加1000010来避免负数,orz....直接加负数就不用分类讨论了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 const int MAXN=2000100; 8 int mark[MAXN]; 9 10 11 int main(){ 12 int num[4]; 13 while(~scanf("%d",&num[0])){ 14 scanf("%d%d%d",&num[1],&num[2],&num[3]); 15 sort(num,num+4); 16 if(num[3]<0||num[0]>0){puts("0");continue;} 17 memset(mark,0,sizeof(mark)); 18 int count=0; 19 //注释部分也是ac代码。。。耗时略长 20 /* 21 if(num[1]<0){ 22 for(int i=1;i<=100;i++){ 23 for(int j=1;j<=100;j++){ 24 int s=-1*num[0]*i*i-num[1]*j*j; 25 mark[s]++; 26 } 27 } 28 int count=0; 29 for(int i=1;i<=100;i++){ 30 for(int j=1;j<=100;j++){ 31 int s=num[2]*i*i+num[3]*j*j; 32 if(s<0)continue; 33 count+=mark[s]; 34 } 35 } 36 printf("%d\n",count*16); 37 }else { 38 for(int i=1;i<=100;i++){ 39 int s=-1*num[0]*i*i; 40 mark[s]++; 41 } 42 int count=0; 43 for(int i=1;i<=100;i++){ 44 for(int j=1;j<=100;j++){ 45 for(int k=1;k<=100;k++){ 46 int s=num[1]*i*i+num[2]*j*j+num[3]*k*k; 47 count+=mark[s]; 48 } 49 } 50 } 51 printf("%d\n",count*16); 52 }*/ 53 for(int i=1;i<=100;i++){ 54 for(int j=1;j<=100;j++){ 55 mark[num[0]*i*i+num[1]*j*j+1000010]++; 56 } 57 } 58 for(int i=1;i<=100;i++){ 59 for(int j=1;j<=100;j++){ 60 count+=mark[1000010-num[2]*i*i-num[3]*j*j]; 61 } 62 } 63 printf("%d\n",count*16); 64 } 65 return 0; 66 }