【转】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; }