Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 5966 | Accepted: 2885 |
Description
Input
Output
Sample Input
37 29 41 43 47
Sample Output
654
Source
//写了枚举,超慢。
#include <iostream> using namespace std; int main() { int a1,a2,a3,a4,a5; int cnt; while(cin>>a1>>a2>>a3>>a4>>a5) { cnt=0; for(int i=-50; i<=50; i++) for(int j=-50; j<=50; j++) for(int k=-50; k<=50; k++) for(int m=-50; m<=50; m++) for(int n=-50; n<=50; n++) { if(n!=0 && m!=0 && k!=0 && j!=0 && i!=0) if(a1*i*i*i+a2*j*j*j+a3*k*k*k+a4*m*m*m+a5*n*n*n==0) cnt++; } cout<<cnt<<endl; } return 0;
思路:hash的应用。暴力枚举的话会达到100^5,明显会超时。所以将方程分成-(a1x13+ a2x23 )和 a3x33+a4x43+ a5x53 两部分,若这两部分相等,则为方程的一个解。
#include <iostream> #include <cstring> using namespace std; const int MAX_NUM=25000000; char hash[MAX_NUM+1]; int main() { int a1,a2,a3,a4,a5; int cnt; int temp,hashcode; while(cin>>a1>>a2>>a3>>a4>>a5) { cnt=0; memset(hash,0,sizeof(hash)); //compute first 2 terms for(int i=-50; i<=50 ;i++) { for(int j=-50; j<=50; j++) { if(i!=0&&j!=0) { temp=a1*i*i*i+a2*j*j*j; hash[temp+MAX_NUM/2]++; } } } for(int i=-50; i<=50 ;i++) { for(int j=-50; j<=50; j++) { for(int k=-50; k<=50; k++) { if(i!=0&&j!=0&&k!=0) { temp=a3*i*i*i+a4*j*j*j+a5*k*k*k; if(temp<=MAX_NUM/2 && temp>= -MAX_NUM/2) cnt+=hash[-temp+(MAX_NUM/2)]; } } } } cout<<cnt<<endl; } return 0; }