posts - 99,  comments - 8,  trackbacks - 0

 

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

posted on 2010-08-28 21:16 雪黛依梦 阅读(441) 评论(0)  编辑 收藏 引用 所属分类: 哈希法

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜