东南大学 38: 外星人来袭

来源:互联网 发布:淘宝网帽子女士太阳帽 编辑:程序博客网 时间:2024/04/29 14:27

分析:

这是一个经典的划分问题,因为不允许开始为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);    }}

0 0
原创粉丝点击