c题题解

思路

状态表示:f[i] => 组成正整数i的方案数 (组成i:若干个正整数相加得到的和为i)
由题意知:相加序列中的每个数都大于或者等于k

所以可进行集合划分如下:
case 1:相加序列中的最后一个数为k.因为减去k之后和为i-k,所以此时的方案数为 f[i-k]
case 2:相加序列中的最后一个数大于k,最后一个数减去1之和和为i-1,所以此时的方案数为f[i-1]

综上 Code如下.

Code

#include <cstdio>
#include <iostream>
#include <algorithm>
#define mod 1000000007

using namespace std;

typedef long long ll;

const int N=1e6+10;

ll f[N]; // f[i]:组成正整数i的方案数
int n,k;

int main(){   
    scanf("%d %d",&n,&k);

    f[k]=1;  //f[i],i从k开始有效
    for(int i=k;i<=n;i++)  f[i]=(f[i]+f[i-k]+f[i-1])%mod;

    cout<<f[n]<<endl;

    return 0;
}