题目链接: http://poj.org/problem?id=1840
题目大意: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}.
解题思路: 将等式转化为 -(a1x13+ a2x23) = a3x33+ a4x43+ a5x53 这样就直接减少了时间复杂度
将等式左边值设为Hash的下标,为了不为负,左右两边都加上一个50*50^3*3 = 18750000 所以要加一个比它大的数,我这里用的是25000000
#include<cstdio>
#include<cstring>
const int maxn = 25000001;
short Hash[maxn];
int l = -50, r = 50;
int main ()
{
int a1,a2,a3,a4,a5;
while(scanf("%d %d %d %d %d", &a1, &a2, &a3, &a4, &a5) != EOF)
{
memset(Hash, 0, sizeof(Hash));
for(int x1 = l; x1 <= r; x1++)
{
if(!x1) continue;
for(int x2 = l; x2 <= r; x2++)
{
if(!x2) continue;
int sum = a1*x1*x1*x1 + a2*x2*x2*x2;
if(sum < 0) sum += 25000000;
Hash[sum]++;
}
}
int ans = 0;
for(int x3 = l; x3 <= r; x3++)
{
if(!x3) continue;
for(int x4 = l; x4 <= r; x4++)
{
if(!x4) continue;
for(int x5 = l; x5 <= r; x5++)
{
if(!x5) continue;
int sum = a3*x3*x3*x3+a4*x4*x4*x4+a5*x5*x5*x5;
if(sum < 0) sum += 25000000;
ans += Hash[sum];
}
}
}
printf("%d\n", ans);
}
return 0;
}