zoukankan      html  css  js  c++  java
  • 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 );
    	}
    	
    }
    
  • 相关阅读:
    Spring的AOP深入理解
    枚举和注解学习笔记
    单例模式
    工厂设计模式
    网络编程
    多线程笔记
    IOI2021集训队作业
    计蒜客 mark
    51nod mark
    关于此博客
  • 原文地址:https://www.cnblogs.com/Lyush/p/2061236.html
Copyright © 2011-2022 走看看