//题意:求解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; }