HDU1496Equations【hash】

Description

Consider equations having the following form: 

a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 
a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0. 

It is consider a solution a system ( x1,x2,x3,x4 ) that verifies the equation, xi is an integer from [-100,100] and xi != 0, any i ∈{1,2,3,4}. 

Determine how many solutions satisfy the given equation. 
 

Input

The input consists of several test cases. Each test case consists of a single line containing the 4 coefficients a, b, c, d, separated by one or more blanks. 
End of file.
 

Output

For each test case, output a single line containing the number of the solutions. 
 

Sample Input

1 2 3 -4 1 1 1 1
 

Sample Output

39088 0
 
分析:与上题相同
 
代码:
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int mod = 40007;
 7 
 8 struct Node {
 9     int to;
10     int next;
11 }e[mod + 10];
12 
13 int head[mod + 10];
14 
15 int tot;
16 
17 void Add(int u, int v) {
18     e[tot].to = v;
19     e[tot].next = head[u];
20     head[u] = tot++;
21 }
22 
23 int Find(int u, int v) {
24     int cnt = 0;
25     for(int i = head[u]; i; i = e[i].next) {
26         if(e[i].to == v) cnt++;
27     }
28     return cnt;
29 }
30 
31 void init() {
32     memset(head, 0, sizeof(head));
33     tot = 1;
34 }
35 
36 int Fabs(int x) {
37     return x > 0 ? x : - x;
38 }
39 
40 int pre[105];
41 
42 int main() {
43     int a, b, c, d;
44     for(int i = 1; i <= 100; i++) {
45         pre[i] = i * i;
46     }
47     while(EOF != scanf("%d %d %d %d",&a, &b, &c, &d) ) {
48         init();
49         for(int i = 1; i <= 100; i++) {
50             for(int j = 1; j <= 100;    j++) {
51                 int num = a * pre[i] + b * pre[j];
52                 int p = Fabs(num) % mod;
53                 Add(p, num);
54             }
55         } 
56         int ans = 0;
57         for(int i = 1; i <= 100; i++) {
58             for(int j = 1; j <= 100;    j++) {
59                 int num = c * pre[i] + d * pre[j];
60                 int p = Fabs(num) % mod;
61                 ans += Find(p, - num);
62             }
63         } 
64         printf("%d
", ans << 4);
65     }
66     return 0;
67 }
View Code
原文地址:https://www.cnblogs.com/zhanzhao/p/3991395.html