Description
Input
Output
Sample Input
37 29 41 43 47
Sample Output
654
这道题是参考别人的,不得不说做ACM果然还是要有比较灵敏的思维啊,第一次使用哈希表做题。
先将方程变化成-(a1*x1^3+a2*x2^3) = a3*x3^3+a4*x4^3+a5*x5^3,如此一来缩短了时间复杂度,否则直接五个嵌套for循环必然会超时的
其次,我们把sum作为下标,那么hash数组的上界就取决于a1 a2 x1 x2的组合,四个量的极端值均为50
因此上界为 50*50^3+50*50^3=12500000,由于sum也可能为负数,因此我们对hash[]的上界进行扩展,扩展到25000000,当sum<0时,我们令sum+=25000000存储到hash[],负数就改为正数表示了
由于数组很大,必须使用全局定义
同时由于数组很大,用int定义必然会MLE,因此要用char或者short定义数组,推荐short
#include <stdio.h> #include <string.h> short hash[25000001]; int main() { int a1,a2,a3,a4,a5,x1,x2,x3,x4,x5,sum; while(~scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5)) { memset(hash,0,sizeof(hash)); for(x1 = -50; x1<=50; x1++) { if(!x1) continue; for(x2 = -50; x2<=50; x2++) { if(!x2) continue; sum = -1*(a1*x1*x1*x1+a2*x2*x2*x2); if(sum<0) sum+=25000000;//数字下标没有负数,换一种出储存方式 hash[sum]++; } } int cnt = 0; for(x3 = -50; x3<=50; x3++) { if(!x3) continue; for(x4 = -50; x4<=50; x4++) { if(!x4) continue; for(x5 = -50; x5<=50; x5++) { if(!x5) continue; sum = a3*x3*x3*x3+a4*x4*x4*x4+a5*x5*x5*x5; if(sum<0) sum+=25000000; cnt+=hash[sum]; } } } printf("%d\n",cnt); } return 0; }