求满足公式的解有多少种,其中xi!=0;这道题应该要缩小枚举的范围,将等式化为两边相等,即a1x13+ a2x23+ a3x33= - ( a4x43+ a5x53 或者前面两项后面三项都是一样的。所以首先要枚举右边的值可以有那些,再枚举左边的值看那些可以和右边的值相等即可。还有一个地方值得注意,做这道题我本来也是想接触hash的,所以3*50^4=18750000,一千万的数组很大,而且每个值可能有多种答案,所以需要hash来节约空间。
代码:
#include<iostream> #include<vector> #define maxn 87719 using namespace std; struct node { int x4,x5,m; node(int x,int y,int z):x4(x),x5(y),m(z){} node(){} }; vector<node> hash[maxn]; int main() { int a1,a2,a3,a4,a5,cnt,m; int i,j,k,r,s,it; // freopen("out.txt","w",stdout); while( scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5)!=EOF){ for( i=-50;i<=50;i++) for( j=-50;j<=50;j++){ m=a4*i*i*i+a5*j*j*j; if( i==0||j==0) continue; if( m>=0) hash[m%maxn].push_back(node(i,j,m)); else hash[(-m)%maxn].push_back(node(i,j,m)); } cnt=0; for( i=-50;i<=50;i++) for( j=-50;j<=50;j++) for( k=-50;k<=50;k++){ if( i==0||j==0||k==0) continue; m=a1*i*i*i+a2*j*j*j+a3*k*k*k; if( m>=0) r=m%maxn; else r=(-m)%maxn; s=hash[r].size(); for( it=0;it<s;it++) if( hash[r][it].m+m==0){ cnt++; } } printf("%d\n",cnt); } return 0; }