题意:给出n,k,问恰好有k个不超过n的数的和为n的方案数有多少
可以隔板法来做 现在有n个小球放到k个盒子里面,盒子可以为空
那么就是n-k+1个缝隙,放上k-1个隔板(k-1个隔板就分成了k份) 所以总的方案数为 C(n+k-1,k-1)
所以可以转化为C(i,j)=C(i-1,j)+C(i,j-1)
即为d[i][j]=d[i-1][j]+d[i][j-1],
d[i][j]表示j个数的和恰为i的方案数
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = (1<<30)-1; 15 const int mod=1000000; 16 const int maxn=1000005; 17 18 int d[1005][1005]; 19 20 int main(){ 21 int k,n; 22 memset(d,0,sizeof(d)); 23 for(int i=1;i<=105;i++) d[0][i]=1; 24 25 for(int i=1;i<=105;i++){ 26 for(int j=1;j<=105;j++){ 27 d[i][j]=(d[i-1][j]+d[i][j-1])%mod; 28 } 29 } 30 31 while(scanf("%d %d",&n,&k)!=EOF&&n&&k){ 32 printf("%d\n",d[n][k]); 33 } 34 return 0; 35 }