//题意:求解5元一次方程,问共有多少个解,注意所有的解不能为0
//思路:将5元转换为2元和3元,然后对2元所有解打表然后在3元中找匹配的解,本来思路是2元最多共有101*101种结果,因此也就是100201种键,按照这个思路开一个hash,不知道为什么总是丢解,最后想想本题是为了求的解的个数,那么其实主要的映射关系是多对一,也就是只需要将所有情况枚举出来的同时,对每种键所对应的解的个数++即可,也可以用取余的方式建立hash,但是此题可以得知方程和的最大值为50^4 + 50^4(系数和未知数最大都为50),而最小则为-(50^4 + 50^4),那么给枚举的数加上25000000则恰好可以全部枚举出来,见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
short Hash[25000001];
int main()
{
int a, b, c, d, e;
while(cin >> a >> b >> c >> d >> e){
memset(Hash, 0, sizeof(Hash));
int sum;
for(int i = -50; i <= 50; i++){
if(!i) continue;
for(int j = -50; j <= 50; j++){
if(!j) continue;
sum = a*i*i*i + b*j*j*j;
if(sum < 0)
sum += 25000000;
Hash[sum]++;
}
}
int cnt = 0;
for(int i = -50; i <= 50; i++){
if(!i) continue;
for(int j = -50; j <= 50; j++){
if(!j) continue;
for(int 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;
if(Hash[sum]){
cnt += Hash[sum];
}
}
}
}
cout << cnt << endl;
}
return 0;
}