jzoj 1292. 公牛和母牛 (Standard IO)

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

題目大意:

求有多少种放置方法,使兩頭公牛間至少有KK頭母牛。

題解:

dp,設f [i,0] f~[i,0]~表第i頭放母牛的方案數
f [i,1] f~[i,1]~表第i頭放公牛的方案數
易推f [i,0] f~[i,0]~=f [i1,0] f~[i-1,0]~+f [i1,1] f~[i-1,1]~//如果放母牛,上一個公母都可以。
f [i,1] f~[i,1]~=f [ik1,0] f~[i-k-1,0]~+f [ik1,1] f~[i-k-1,1]~//如果放公牛,上一個公牛必須放ik1i-k-1格前
答案爲f[n,0]+f[n,1]f[n,0]+f[n,1]

#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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章