分析:
这是一个经典的划分问题,因为不允许开始为0,则划分成k天的时,我们先把n减去k,然后求 n-k 的k划分数,就是其解。因此我们预处理所有n的k划分数,C[n][k],然后对于每个k
我们令i为从1到n和k的较小值 ,累加求和C[n-i][i]。
代码:
#include<cstdio>
const int MOD = 1000000007;
const int maxn = 40000;
const int maxk = 100;
int C[maxn+5][maxk+5];
int main(){
int n,k;
for(int i = 1; i <= maxk; i++) C[0][i] = 1;
for(int k = 1; k <= maxk; k++){
for(int n = 1; n <= maxn;n++){
if(n>=k) C[n][k] = (C[n-k][k] + C[n][k-1]) % MOD;
else C[n][k] = C[n][k-1];
}
}
while(scanf("%d%d",&n,&k)==2){
int ans = 0;
for(int i = 1; i <= k && i <= n; i++){
ans = (ans + C[n-i][i]) % MOD;
}
printf("%d\n", ans);
}
}