HDU 1496

HDU 1496

 

// 把任意长度的输入,通过散列算法,变换成固定长度的输出 
//  经典的哈希算法  这个题目在减少复杂度的方面真的有很多的技巧值得我学习 
//  因为直接存储四项的值 有四重循环,这样耗时很多,所以开一个满足题意要求的数组存储
// 等式两边的计算值如果出现下标相等就说明满足题意,同时起到了计数的作用
// 因为平方的作用从 1 -- 100 循环减少了复杂度 ,只是记得最后一定要乘以一个16哦! 
#include  < iostream >
#include 
< string >
using   namespace  std;

int  hash[ 2000010 ]; 
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;
          }

          memset ( hash, 
0sizeof (hash) );
          
int count = 0;
          
for ( int i = 1; i <= 100; i ++ )
          
{
              
for ( int j = 1; j <= 100; j ++ )
              
{
                  hash[ a * i * i + b * j * j + 1000000 ] ++;       //每一个不同的a*x1^2 + b*x2^2 hash值都是 1   
              }
          }
 
          
          
for ( int i = 1; i <= 100; i ++ )
          
{
              
for ( int j = 1; j <= 100; j ++ )
              

                  count += hash[ 1000000 - c * i * i - d * j * j ]; //如果出现了相同的hash值 则:+ 1            
              }
          }
 
          printf (
"%d\n"16 * count);                                                        //反之count会 = 0 
    }


    
//system ("pause");          
     return 0;
}

你可能感兴趣的:(HDU 1496)