HDU 1496 equation 非常好的Hash

这道题目如果用一个四重循环的话应该会超时,可以将方程转换为一个等式,a*x1*x1+b*x2*x2=-(c*x3*x3+d*x4*x4);但是如何寻找适当x1,x2,x3,x4是这个等式成立呢,用Hash是一个不错的选择,将a*x1*x1+b*x2*x2映射到一个很大的数组(经过计算1000000即可),然后再对二重循环c*x3*x3+d*x4*x4的结果与相对应的Hash值相比较即可

View Code
 1 /*
2 * Author:lonelycatcher
3 * problem:hdu 1496
4 * Type:Hash
5 */
6 #include <iostream>
7 #include<stdio.h>
8 #include<string.h>
9 using namespace std;
10 int a,b,c,d;
11 int Hash1[1000001];//存储大于零的哈希值
12 int Hash2[1000001];//存储小于零的哈希值
13 int main()
14 {
15 setbuf(stdout,NULL);
16 int ans,i,j;
17 while(scanf("%d %d %d %d",&a,&b,&c,&d)!=EOF)
18 {
19 ans=0;
20 if((a>0&&b>0&&c>0&&d>0)||(a<0&&b<0&&c<0&&d<0))
21 {
22 printf("0\n");continue;
23 }
24 for(i=0;i<1000001;i++)
25 {
26 Hash1[i]=Hash2[i]=0;
27 }
28
29 for(i=1;i<=100;i++)
30 {
31 for(j=1;j<=100;j++)
32 {
33 int temp=a*i*i+b*j*j;
34 if(temp>=0)
35 {
36 Hash1[temp]++;
37 }
38 else Hash2[-temp]++;
39 }
40 }
41 for(i=1;i<=100;i++)
42 {
43 for(j=1;j<=100;j++)
44 {
45 int temp=c*i*i+d*j*j;
46 if(temp>0)
47 {
48 ans+=Hash2[temp];
49 }else
50 ans+=Hash1[-temp];
51 }
52 }
53 printf("%d\n",16*ans);
54 }
55 return 0;
56 }

posted on 2011-08-23 11:43  lonelycatcher  阅读(401)  评论(0编辑  收藏  举报

导航