Acwing1307. 牡牛和牝牛
/*
数组没开够,爆零两行泪
longlong开成int,爆零两行泪
多组忘清空,爆零两行泪
dp 没初值,爆零两行泪
深搜没边界,爆零两行泪
广搜忘出队,爆零两行泪
输入没加 &,爆零两行泪
模数没看见,爆零两行泪
-1 不输出,爆零两行泪
越界不特判,爆零两行泪
线段树开一倍,爆零两行泪
无向变有向,爆零两行泪
题意没审清,爆零两行泪
文件名起错,爆零两行泪
调试忘删除,爆零两行泪
没用freopen,爆零两行泪
*/
#include<bits/stdc++.h>
using namespace std;
const int N=100010,mod=5000011;
int n,k;
int f[N],s[N];
int main(){
cin>>n>>k;
f[0]=s[0]=1;
for(int i=1;i<=n;i++){
f[i]=s[max(i-k-1,0)]%mod;
s[i]=(s[i-1]+f[i])%mod;
}
cout<<s[n]<<endl;
return 0;
}
/*
约翰要带N只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛。
牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛。
请计算一共有多少种排队的方法,所有牡牛可以看成是相同的,所有牝牛也一样,答案%5000011。
思路:
计数经典题,考虑用1代替牡牛,0代替牝牛
f(i)以1结尾表示前i位的排队方案数
把前i头牛分成i-k类,(0,1,......i-k-1)表示第某位是1,后面都是零,如XXXXX10001
注意i-k-1的特判
则显然f(i)=Σj从1到j-k-1,f(j)
复杂度O(n^2)
考虑优化,用s[]记录前缀和,求f[]的同时处理s[]
复杂度O(n)
*/