题目描述
题解
好裸的一道dp!f(i)表示把前i个空填满的方案数。
f(i)=∑i−k−1j=1f(j),ans=∑ni=0f(i)
然后前缀和优化一下。
时间复杂度
O(n)
。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define Mod 5000011
#define N 100005
int n,k,sum,ans;
int f[N];
int main()
{
scanf("%d%d",&n,&k);
for (int i=0;i<=n;++i) f[i]=1;
sum=0;
for (int i=k+1;i<=n;++i)
{
f[i]=(f[i]+sum)%Mod;
sum=(sum+f[i-k])%Mod;
}
// for (int j=1;j<=i-k-1;++j)
// f[i]=(f[i]+f[j])%Mod;
for (int i=0;i<=n;++i) ans=(ans+f[i])%Mod;
printf("%d\n",ans);
}