Description
已知一个n元高次方程: 其中:x1, x2,...,xn是未知数,k1,k2,...,kn是系数,p1,p2,...pn是指数。且方程中的所有数均为整数。 假设未知数1 <= xi <= M, i=1,,,n,求这个方程的整数解的个数。 1 <= n <= 6;1 <= M <= 150。 方程的整数解的个数小于2 31。 ★本题中,指数Pi(i=1,2,...,n)均为正整数。Input
第1行包含一个整数n。第2行包含一个整数M。第3行到第n+2行,每行包含两个整数,分别表示ki和pi。两个整数之间用一个空格隔开。第3行的数据对应i=1,第n+2行的数据对应i=n。Output
仅一行,包含一个整数,表示方程的整数解的个数。Sample Input
3 150 1 2 -1 2 1 2Sample Output
178 #include<iostream>#include<cstdio>#include<cstring>using namespace std;const int HASHING=10000000;int hash_table[HASHING+1];int hash_num[HASHING+1];int n,m,h;int cnt;struct Node{ int k,p;};Node x[7];int _pow(int x,int i){ if(i==0) return 1; if(i==1) return x; int tmp=_pow(x,i/2); tmp=tmp*tmp; if(i&1) return tmp*x; return tmp;}int hash(int x)//创建hash表{ int ret=x; while(ret<0) ret+=HASHING; ret=ret%HASHING; while(hash_table[ret]!=-1&&hash_table[ret]!=x) ret=(ret+1)%HASHING; hash_table[ret]=x;hash_num[ret]++; return ret;}int hashok(int x){ int ret=x; while(ret<0) ret+=HASHING; ret=ret%HASHING; while(hash_num[ret]) { if(hash_table[ret]==x) return hash_num[ret]; ret=(ret+1)%HASHING; } return 0;}void dfsl(int step,int val)//创建hash表{ if(step==h) hash(val); else { for(int i=1;i<=m;i++) //枚举xi { dfsl(step+1,val+x[step].k*_pow(i,x[step].p)); } }}void dfsr(int step,int val)//检查val是否已经存在{ if(step==n)// 到n截止 { cnt+=hashok(-val);//-val 等式右面 return ; } for(int i=1;i<=m;i++) dfsr(step+1,val+x[step].k*_pow(i,x[step].p));}void Solve(){ memset(hash_table,-1,sizeof(hash_table)); memset(hash_num,0,sizeof(hash_num)); cnt=0;h=n/2; dfsl(0,0); dfsr(h,0); printf("%d/n",cnt);}int main(){ while(scanf("%d%d",&n,&m)==2) { for(int i=0;i<n;i++) scanf("%d%d",&x[i].k,&x[i].p); if(n==1) printf("%d/n",x[0].k==0?m:0); else Solve(); } return 0;} poj 1840: #include<iostream>#include<cstdio>#include<cstring>using namespace std;const int HASHING=1500000;int hash_table[HASHING],vis[HASHING];int hash(int x){ int ret=x; while(ret<0) ret+=HASHING; ret%=HASHING; while(hash_table[ret]!=-1&&hash_table[ret]!=x) ret=(ret+1)%HASHING; hash_table[ret]=x;vis[ret]++; return ret;}int hashok(int x){ int ret=x; while(ret<0) ret+=HASHING; ret%=HASHING; while(hash_table[ret]!=-1) { if(hash_table[ret]==x) return vis[ret]; ret=(ret+1)%HASHING; } return 0;}int a[5];int main(){ while(scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4])==5) { memset(hash_table,-1,sizeof(hash_table)); memset(vis,0,sizeof(vis)); for(int i=-50;i<=50;i++) { if(i==0) continue; for(int j=-50;j<=50;j++) { if(j==0) continue; int tmp=a[0]*i*i*i+a[1]*j*j*j; hash(tmp); } } int cnt=0; for(int i=-50;i<=50;i++) { if(i==0) continue; for(int j=-50;j<=50;j++) { if(j==0) continue; for(int k=-50;k<=50;k++) { if(k==0) continue; int tmp=a[2]*i*i*i+a[3]*j*j*j+a[4]*k*k*k; cnt+=hashok(-tmp); } } } printf("%d/n",cnt); } return 0;}