复习1
/*
dp[i]:以位置i结尾的方案总数
*/
#include <bits/stdc++.h>
using ll=long long;
const ll p=1e9+7;
const ll N=1e6+9;
int n,k;
long long dp[N],prefix[N];
using namespace std;
int main()
{
cin>>n>>k;
dp[0]=prefix[0]=1;
for(int i=1;i<=n;i++)
{
//怎样体现出放与不放的
//dp[i]表示第i个位置的方案数
if(i-k-1<1) dp[i]=1;
//如果前面没有的位置小于要求间隔那么只有一种方案
else dp[i]=prefix[i-k-1];//状态转移方程
//通过前缀和数组来体现
prefix[i]=(prefix[i-1]+dp[i])%p;
}
cout<<prefix[n]<<endl;
return 0;
}
#include <bits/stdc++.h>
const int p=1e9+7;
const int N=1e6+9;
int n,k;
long long dp[N];
using namespace std;
int main()
{
cin>>n>>k;
dp[1]=2;
for(int i=2;i<=n;i++)
{
dp[i]=(dp[i]+dp[i-1])%p;
if(i-k>1) dp[i]=(dp[i]+dp[i-k-1])%p;
else dp[i]=(dp[i-1]+1)%p;
}
cout<<dp[n]<<endl;
return 0;
}