/* 将n个不同的球放入m个不同的盒子的方案数 m^n */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,a[1010],l; int main() { scanf("%d%d",&n,&m); int k=m; while(k) { a[++l]=k%10; k=k/10; } for(int i=2;i<=n;i++) { for(int j=1;j<=l;j++)a[j]=a[j]*m; for(int j=1;j<=l;j++) if(a[j]>9) { a[j+1]+=a[j]/10; a[j]=a[j]%10; } if(a[l+1])l++; } for(int i=l;i>=1;i--) printf("%d",a[i]); return 0; }
/* 将n个相同的球放入m个不同的盒子的方案数 x1+x2+...+xm=n 都加1 x1+x2+...+xm+m=n+m 每个解不为0 直接隔板法 C(m-1,m+n-1) */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m; int main() { scanf("%d%d",&n,&m); int p=m-1; int q=m+n-1; int sum=1,div=1; for(int i=q;i>=q-p+1;i--) sum*=i; for(int i=1;i<=p;i++) div*=i; printf("%d\n",sum/div); return 0; }
/* 将n个相同的球放入m个相同的盒子的方案数 f[i][j]=f[i][j-i]+f[i-1][j]; */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int T,n,m,f[100][100]; int Dfs(int k,int p) { if(k==0||p==1)return 1; if(f[k][p])return f[k][p]; if(p>k)return Dfs(k,k); return Dfs(k,p-1)+Dfs(k-p,p); } int main() { scanf("%d",&T); while(T--) { memset(f,0,sizeof(f)); scanf("%d%d",&n,&m); printf("%d\n",Dfs(n,m)); } return 0; }
/* 将n个不同的球放入m个相同箱子里的方案数 F[i][j]=f[i-1][j-1]+f[i-1][j]*j; */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,f[100][100]; int main() { scanf("%d%d",&n,&m); f[0][0]=1; for(int i=1;i<=n;i++) for(int j=1;j<=i&&j<=m;j++) f[i][j]=f[i-1][j-1]+f[i-1][j]*j; printf("%d\n",f[n][m]); return 0; }
时间: 2024-10-15 08:22:03