本题主要就是一开始的想法,想到后就比较水了。(没想到啊。。。)解5元方程组,每个未知数从-50~50,先三个一组枚举所有可能值,记录下次数,剩下的两个一组,出现之前出现过的值即将总数加上当前值之前出现过的次数(因为未知数正负对称,找与自己相同的值亦可,不一定非要找相反数,不过没什么实际差别),记录出现次数时,因为范围较大,无法直接开数组,按下标对应记录。所以Hash下就行。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000000;
const int hv=999983;
int a1,a2,a3,a4,a5;
int sum;
struct Node
{
int idx;
int num;
}r[N];
int powerf(int x)
{
return x*x*x;
}
void hashf(int x)
{
int k=x%hv;
if(k<0)k=k+hv;
if(r[k].num!=0)
{
if(r[k].idx==x)r[k].num++;
else
{
int z=k;
while(r[z].num!=0)
{
if(r[z].idx==x)
{
r[z].num++;
break;
}
z++;
}
if(r[z].num==0)
{
r[z].idx=x;
r[z].num++;
}
}
}
else
{
r[k].idx=x;
r[k].num++;
}
}
void Find(int x)
{
int k=x%hv;
if(k<0)k=k+hv;
while(r[k].num!=0)
{
if(r[k].idx==x)
{
sum+=r[k].num;
break;
}
k++;
}
}
int main()
{
sum=0;
for(int i=0;i<N;i++)
{
r[i].num=0;
r[i].idx=0;
}
scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
for(int i=-50;i<=50;i++)
{
for(int j=-50;j<=50;j++)
{
for(int k=-50;k<=50;k++)
{
if(i==0||j==0||k==0)continue;
int x=powerf(i)*a1+powerf(j)*a2+powerf(k)*a3;
hashf(x);
}
}
}
for(int i=-50;i<=50;i++)
{
for(int j=-50;j<=50;j++)
{
if(i==0||j==0)continue;
int x=powerf(i)*a4+powerf(j)*a5;
Find(x);
}
}
printf("%d\n",sum);
return 0;
}