题目:
有以下方程:a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 ,方程的系数和xi的范围都为[-50,50],求出方程解的个数。
解题思路:
将方程移下位:a1x13+ a2x23 = -(a3x33+ a4x43+ a5x53),当方程左边等于右边时,求得方程的一个解。
a1x13的上限为504=6250000,a1x13+ a2x23 的范围为[-12500000, 12500000],我们将区间加上12500000变成正区间[0,25000000]
开辟一个大小为25000001的数组hash,计算方程左边所有可能的值,对某个值i,使hash[i+12500000]++
计算方程右边所有可能的值,对于某个值j,如果j+12500000对于hash数组是个合法的下标,并且hash[j+12500000]不为0,说明方程左边有hash[j+12500000]种情况和这个值j相等,将hash[j+12500000]累加进结果值中
方程右边所有可能值计算完后,输出结果值。
代码:
#include<stdio.h>
short hash[25000001];
int main()
{
int a1,a2,a3,a4,a5;
int x1,x2,x3,x4,x5;
int ans=0,sum;
memset(hash,sizeof(hash),0);
scanf("%d %d %d %d %d", &a1, &a2, &a3, &a4, &a5);
for(x1=-50; x1<51; x1++)
{
if(!x1)continue;
for(x2=-50; x2<51; x2++)
{
if(!x2) continue;
sum=a1*x1*x1*x1+a2*x2*x2*x2;
hash[sum+12500000]++;
}
}
for(x3=-50; x3<51; x3++)
{
if(!x3)continue;
for(x4=-50; x4<51; x4++)
{
if(!x4) continue;
for(x5=-50; x5<51; x5++)
{
if(!x5) continue;
sum=-(a3*x3*x3*x3+a4*x4*x4*x4+a5*x5*x5*x5);
sum +=12500000;
if(sum<0 || sum>25000000) continue;
if(hash[sum]) ans+=hash[sum];
}
}
}
printf("%d\n",ans);
return 0;
}