相当于求解方程x1+x2+......+xk=N。把这个方程转化为(x1+1)+(x2+1)+......+(xk+1)=N+K,这样每一项都是大于等于1的。那就相当于把N+K个1排成一行,分隔成K个部分,也就是在N+K-1条分隔线中选K-1条,C[N+K-1][K-1]就是答案。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#include <algorithm>
const int mod=1000000;
int C[205][205];
int main(){
for(int i=0;i<=200;i++){
C[i][0]=1;C[i][i]=1;
for(int j=1;j<i;j++){
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
}
int N,K;
while(~scanf("%d%d",&N,&K)){
if(!N&&!K) break;
int res=C[N+K-1][K-1];
printf("%d\n",res);
}
return 0;
}
本文介绍了一种利用组合数学解决特定类型分配问题的方法。通过将原始问题转换为求解带有约束条件的方程,进而简化为计算组合数C[N+K-1][K-1],提供了一个高效的解决方案。
4615

被折叠的 条评论
为什么被折叠?



