题目链接:
思路:一开始没想到加1000010来避免负数,orz....直接加负数就不用分类讨论了。
View Code
1 #include2 #include 3 #include 4 #include 5 #include 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 }