这个问题可以简化成在把N个球放在K个箱子里的方法个数,由于每个箱子可以是空的,所以我们不妨多加K个球,这样就可以至少保证一个箱子有一个球,之后用隔板法对N + K 个球进行分割,也就是在N + K - 1 个空位中选择K - 1位置 C(N + K - 1,K - 1)
求解方法递推就可以了。
另外:
排列数 A(m,n)=m(m-1)(m-2)……(m-n+1)= m!/(m-n)! 而组合数 C(m,n)=A(m,n)/n!
C(m,0) = 1;
0! = 1;
代码:
#include<cstdio> #include<cmath> using namespace std; typedef long long LL; const int maxn = 222; const int mod = 1000000; LL C[maxn][maxn]; void init(){ C[1][0] = 1; C[1][1] = 1; for(int i = 2; i <= 200; i++){ for(int j = 0; j <= i; j++){ if(j) C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; else C[i][j] = 1; C[i][j] %= mod; } } } void debug(){ } int main(){ init(); int n,m; while(scanf("%d%d",&n,&m) != EOF){ if(!n && !m) break; LL ans = C[n + m - 1][m - 1]; printf("%lld\n",ans); } return 0; }
时间: 2024-10-11 02:38:38