Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 10695 | Accepted: 5185 |
Description
Input
Output
Sample Input
37 29 41 43 47
Sample Output
654
题意:求出满足上述等式的解的个数,但x1,x2,x3,x4,x5不能为0;
解题思路:第一感觉是五个循环枚举,那样果断会超时,其时我们可以把x1,x1移项,先枚举x1,x2,哈希之后再枚举x3,x4,x5;
但-a1x1-a2x2结果有可能是负值,这时可以-a1x1-a2x2+12500000将结果变为正的;了解了传说中的哈希函数,值得学习;
1 #include<stdio.h> 2 #include<string.h> 3 char hash[25000000]; 4 5 int main() 6 { 7 int a1,a2,a3,a4,a5; 8 int x1,x2,x4,x5,x3,ans; 9 memset(hash,0,sizeof(hash)); 10 11 scanf("%d %d %d %d %d",&a1,&a2,&a3,&a4,&a5); 12 13 for(x1 = -50; x1 <= 50; x1++) 14 { 15 if(x1 == 0)continue; 16 for(x2 = -50; x2 <= 50; x2++) 17 { 18 if(x2 == 0)continue; 19 ans = -(x1*x1*x1*a1+x2*x2*x2*a2)+12500000; 20 hash[ans]++; 21 } 22 } 23 int cnt = 0; 24 for(x3 = -50; x3 <= 50; x3++) 25 { 26 if(x3 == 0)continue; 27 for(x4 = -50; x4 <= 50; x4++) 28 { 29 if(x4 == 0)continue; 30 for(x5 = -50; x5 <= 50; x5++) 31 { 32 if(x5 == 0)continue; 33 ans = x3*x3*x3*a3+x4*x4*x4*a4+x5*x5*x5*a5+12500000; 34 if(ans >= 0 && ans < 25000000) 35 cnt += hash[ans]; 36 } 37 } 38 } 39 printf("%d\n",cnt); 40 return 0; 41 }