这个题目用到的是哈希这个数据结构
不过觉得关键还是把方程转换成两部分,从而达到降低复杂度的目的。
其实这个跟双向广搜的思想还是十分类似的。
哈希值为和
具体做法,枚举两个系数所能组合成的所有哈希值
再枚举另外三个数的所有哈希值。哈希值相同的即为一个解
#include
#include
#include
#include
using namespace std;
const int maxn=25000000+100,inf=12500000;
short hash[maxn];
int f[155],ans;
int main()
{
int a[10];
while(scanf("%d %d %d %d
%d",&a[1],&a[2],&a[3],&a[4],&a[5])!=EOF)
{
ans=0;
memset(hash,0,sizeof(hash));
for(int i=-50;i<=50;i++)
f[i+50]=i*i*i;
for(int i=-50;i<=50;i++)
for(int j=-50;j<=50;j++)
{
if(i==0)
continue;
if(j==0)
continue;
int
txt1=f[i+50]*a[1];
int
txt2=f[j+50]*a[2];
hash[txt1+txt2+inf]++;
}
for(int i=-50;i<=50;i++)
for(int j=-50;j<=50;j++)
for(int k=-50;k<=50;k++)
{
if(i==0)
continue;
if(j==0)
continue;
if(k==0)
continue;
int
txt1=f[i+50]*a[3];
int
txt2=f[j+50]*a[4];
int
txt3=f[k+50]*a[5];
if(txt1+txt2+txt3+inf=0)
ans+=hash[txt1+txt2+txt3+inf];
}
printf("%d\n",ans);
}
}