How do you add?(隔板法)

这个问题可以简化成在把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];elseC[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;}

你不能左右天气,但你能转变你的心情

How do you add?(隔板法)

相关文章:

你感兴趣的文章:

标签云: