Equations
Problem 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
自己写了一个四重循环的程序,毫无意外的超时了,可能是对hash还是没有深入的了解,一时不知道如何转换这道题目,了解到别人的解题思路后知道这道题目给了我们 a,b,c,d 四个系数,而未知数却又四个,因此常规写法会有四重循环。。。 hash的处理即使将四个未知数拆成两部分(受到程序内存分配的影响),进行hash ,将两个未知数通过二维数组下标映射到一个唯一物理内存,这片区域即是一半方程式的值,此时只要做一个减法就可了,a+ b= 0, 得到 b= 0- a; 还是用数组来快速定位。
代码如下:
#include <stdio.h> #include <string.h> int hash[2000005]; int main( ) { int a, b, c, d; while( ~scanf( "%d%d%d%d", &a, &b, &c, &d ) ) { if( a> 0&& b> 0&& c> 0&& d> 0|| a< 0&& b< 0&& c< 0&& d< 0 ) { printf( "0\n" ); continue; } memset( hash, 0, sizeof( hash ) ); //置于上面会超时 int cnt= 0; for( int i= 1; i<= 100; ++i ) { for( int j= 1; j<= 100; ++j ) { hash[ a* i* i+ b* j* j+ 1000000 ]++; } } for( int i= 1; i<= 100; ++i ) { for( int j= 1; j<= 100; ++j ) { cnt+= hash[ 1000000- c*i *i- d*j *j ]; } } printf( "%d\n", cnt* 16 ); } }