HDU1496Equations【hash】

本文深入研究了形如 a*x1^2 + b*x2^2 + c*x3^2 + d*x4^2 = 0 的方程,其中系数 a, b, c, d 为[-50,50]区间内的整数且不为零,x1, x2, x3, x4 为[-100,100]区间内的非零整数。通过构建图结构并利用模运算,计算该方程的所有整数解的数量。

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\n", ans << 4);
65     }
66     return 0;
67 }
View Code

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值