HDU1496 Equations [hash]

                               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.

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
     自己写了一个四重循环的程序,毫无意外的超时了,可能是对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 );
	}
	
}
原文地址:https://www.cnblogs.com/Lyush/p/2061236.html