题目:
题解:
以
f
[
i
]
f[i]
f[i] 表示有i只的时候的种数
先考虑 i i i <= k + 1 k+1 k+1 的时候最多有一只牡牛,此时情况共有 i + 1 i+1 i+1 种
此外,只需要考虑最后一只是不是牡牛即可
如果最后一只不是牡牛,表达式为 f [ i ] = f [ i − 1 ] f[i] = f[i-1] f[i]=f[i−1]
如果最后一只是牡牛,则从第
i
−
k
i-k
i−k到
i
−
1
i-1
i−1都不能为牡牛,表达式为
f
[
i
]
=
f
[
i
−
k
−
1
]
f[i] = f[i-k-1]
f[i]=f[i−k−1]
相加即为
f
[
i
]
f[i]
f[i]的方案数
#include <bits/stdc++.h>
using namespace std;
long long mod=5000011;
int f[100005];
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=k+1;i++)
{
f[i]=i+1;
}
for(int i=k+2;i<=n;i++)
{
f[i]=(f[i-1]+f[i-k-1])%mod;
}
cout<<f[n]<<endl;
return 0;
}