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.
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.
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
题目给出一个方程组,给出a, b, c, d,问在[-100,100]区间内有多少组解,可以先移项,分成两部分,a*x1*x1+b*x2*x2 和c*x3*x3+d*x4*x4两部分,先对一个部分进行处理,在哈希数组里进行标记,然后再对另外一部分进行枚举求解,最后的答案需要乘以16, 因为两边的值都可以有正负,且两边都是两个未知数。
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; char vis[2500000]; int main() { int a, b, c, d; while(scanf("%d%d%d%d", &a, &b, &c, &d) != EOF) { if(a>0&&b>0&&c>0&&d>0 || a<0&&b<0&&c<0&&d<0) { printf("0\n"); continue; } long long ans = 0; memset(vis, 0, sizeof(vis)); for(int i = 1; i <= 100; i ++) { for(int j = 1; j <= 100; j ++) { int cnt = a*i*i+b*j*j; if(cnt < 0) { cnt += 2500000; } vis[cnt] ++; } } for(int i = 1; i <= 100; i ++) { for(int j = 1; j <= 100; j ++) { int cnt = -1*c*i*i+(-1)*d*j*j; if(cnt < 0) { cnt += 2500000; } if(vis[cnt]) { ans += vis[cnt]; } } } ans *= 16; printf("%lld\n", ans); } return 0; }