题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398
对于这种有点巧妙的递推还是总是没有思路...
设计一个状态 f[i] 表示第 i 位置上是公牛,那么 f[i] = ∑(0<=j<i-k) f[j];
再前缀和优化一下即可。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int const maxn=1e5+5,mod=5000011; int n,k,f[maxn],s[maxn]; int main() { scanf("%d%d",&n,&k); f[0]=1;s[0]=1; for(int i=1;i<=n;i++) { f[i]=(s[max(0,i-k-1)])%mod; s[i]=(s[i-1]+f[i])%mod; } printf("%d",s[n]); return 0; }