题意: 方程求解: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0
给定a1, a2, a3, a4, a5; =》 在区间[-50,50]之间
求x1 ,x2, x3 ,x4, x5解个数= > 在区间[-50,50]之间, 且xi!=0
解法:
暴力枚举五个数, 显然10^10, TLE是肯定的
那么我们可以将方程改变下,再进行枚举
a3x33+ a4x43+ a5x53= - (a1x13+ a2x23);
只要左右两边相等即表示有有个解
我们可以分别枚举右边2个数求出sum, 用mark数组保存下这个sum的个数
再枚举左边3个数求出sum, 由于上面求出了右边mark【sum】的个数,所以我们就可以知道当前左边这个sum,右边有mark【sum】个来对应,即该组解个数为mark[sum]个
由于数据不大,故直接开了数组存储, (int会超, 建议使用short开数组)
以后如果遇到数组大的, 可采用hash函数进行求hash值,缩小数组的大小, 不过注意处理冲突情况
code:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 25000001;
short mark[maxn];
int main(){
int a, b, c, d, e;
memset(mark, 0, sizeof(mark));
scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);
int i, j, k, sum;
for(i=-50; i<=50; i++){
if(!i) continue;
for(j=-50; j<=50; j++){
if(!j) continue;
sum = a*i*i*i+ b*j*j*j;
sum*=-1;
if(sum<0) sum+=25000000;
mark[sum]++;
}
}
int ans=0;
for(i=-50; i<=50; i++){
if(!i) continue;
for(j=-50; j<=50; j++){
if(!j) continue;
for(k=-50;k<=50; k++){
if(!k) continue;
sum = c*i*i*i+d*j*j*j+e*k*k*k;
if(sum<0) sum+=25000000;
ans += mark[sum];
}
}
}
printf("%d\n",ans );
return 0;
}