Description
FJ想N頭牛(公牛或母牛)排成一排接受胡總的檢閱,經研究發現公牛特別好鬥,如果兩頭公牛離得太近就會發生衝突,通過觀察兩頭公牛之間至少要有K(0<=K<=N)頭母牛才能避免衝突。
FJ想請你幫忙計算一共有多少种放置方法,注意所有的公牛被認爲是一樣的,母牛也是,所以兩種放置方法被認爲不同當且僅當某些位置牛的種類不同。
Input
第一行:兩個空格隔開的整數N(N<=100000)和K。
Output
輸出一個整數表示方法總數,答案可能很大,所以只需輸出mod 5,000,011的值即可。
Sample Input
4 2
Sample Output
6
Data Constraint
Hint
【樣例說明】
以下爲6种放置方法,‘B’表示公牛,‘C’表示母牛
CCCC
BCCC
CBCC
CCBC
CCCB
BCCB
//written by zzy
題目大意:
求有多少种放置方法,使兩頭公牛間至少有頭母牛。
題解:
dp,設表第i頭放母牛的方案數
表第i頭放公牛的方案數
易推=+//如果放母牛,上一個公母都可以。
=+//如果放公牛,上一個公牛必須放格前
答案爲
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100005
#define Mod 5000011
using namespace std;
int i,j,n,m,k;
int f[N][2];
int main()
{
scanf("%d%d",&n,&k);
f[1][1]=1; f[1][0]=1;
for (i=2;i<=k+1;i++)
f[i][1]=1,f[i][0]=(f[i-1][0]+f[i-1][1])%Mod;
for (i=k+2;i<=n;i++) {
f[i][0]=(f[i-1][0]+f[i-1][1])%Mod;
f[i][1]=(f[i-k-1][1]+f[i-k-1][0])%Mod;
}
printf("%d",(f[n][0]+f[n][1])%Mod);
}