求一个五元三次方程的解的个数,虽然x的范围比较小,但是要枚举五个数字时间复杂度也是100的五
次方,肯定会超时,将方程改变下,前两项移到左边,加个负号。这样算的时间复杂度就变成了100^3 + 100^2,
不会超时了,值得注意的是HASH数组很大,用short才不会超出内存。
/*Accepted 49136 KB 735 ms C++ 1156 B 2012-08-23 09:16:51*/ #include<stdio.h> #include<string.h> #include<stdlib.h> const int MAXN = 25000000; short hash[MAXN + 1]; int a1, a2, a3, a4, a5; int l = -50, r = 50; void DoHash() { int x1, x2, sum; memset(hash, 0, sizeof hash); for(x1 = l; x1 <= r; x1 ++) { if(x1 == 0) continue; for(x2 = l; x2 <= r; x2 ++) { if(x2 == 0) continue; sum = -(a1 * x1 * x1 * x1 + a2 * x2 * x2 * x2); if(sum < 0) sum += MAXN; hash[sum] ++; } } } int cal() { int ans = 0, x3, x4, x5, sum; for(x3 = l; x3 <= r; x3 ++) { if(x3 == 0) continue; for(x4 = l; x4 <= r; x4 ++) { if(x4 == 0) continue; for(x5 = l; x5 <= r; x5 ++) { if(x5 == 0) continue; sum = a3 * x3 * x3 * x3 + a4 * x4 * x4 * x4 + a5 * x5 * x5 * x5; if(sum < 0) sum += MAXN; ans += hash[sum]; } } } return ans; } int main() { while(scanf("%d%d%d%d%d", &a1, &a2, &a3, &a4, &a5) != EOF) { DoHash(); printf("%d\n", cal()); } return 0; }