【转】HDU-1496-Equations:巧用哈希

这里可以先将方程化简为a*x1^2+b*x2^2=-(c*x3^2+d*x4^2);

然后再利用哈希表将方程的左侧用两层循环 把取值存起来

最后再通过两层循环寻找和右侧相等的 左侧函数的值的个数 并累加求得Answer

其中具体细节参考代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int Size = 50*100*100*2;// 方程的前两项最大取值
int Hash[2*Size+10];
int main()
{
        int a, b, c, d;
        int Arr[101];
        for(int i=1; i<101; i++)
                    Arr[i]=i*i;// Xi^2 这里还包括-i
        while(cin>>a>>b>>c>>d)
        {
                if((a>0&&b>0&&c>0&&d>0) || (a<0&&b<0&&c<0&&d<0))
                {
                        cout<<0<<endl;
                        continue;
                }

                memset(Hash, 0, sizeof(Hash));
                 for(int i=1; i<101; i++)
                    for(int j=1; j<101; j++)
                            Hash[a*Arr[i]+b*Arr[j]+1000000]++;
                 int Ans=0;
                 for(int i=1; i<101; i++)
                    for(int j=1; j<101; j++)
                            Ans+=Hash[-(c*Arr[i]+d*Arr[j])+1000000];
                 cout<<(Ans<<4)<<endl;//由于对于每一个Xi^2 Xi有正负两种取值 所以总的结局方案在上述的基础上应乘以2^4
        }
        return 0;
}

  

posted @ 2015-08-08 17:16  _SunDaSheng  阅读(126)  评论(0编辑  收藏  举报