hdu 1496(hash经典)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1496

思路:一开始没想到加1000010来避免负数,orz....直接加负数就不用分类讨论了。

View Code
 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 }

 

posted @ 2013-04-29 20:29  ihge2k  阅读(260)  评论(0编辑  收藏  举报