标签:
这里可以先将方程化简为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;
}
标签:
原文地址:http://www.cnblogs.com/FightForCMU/p/4713514.html