1. 程式人生 > >bzoj3398 / [Usaco2009 Feb]Bullcow 牡牛和牝牛

bzoj3398 / [Usaco2009 Feb]Bullcow 牡牛和牝牛

Description

    約翰要帶N(1≤N≤100000)只牛去參加集會裡的展示活動,這些牛可以是牡牛,也可以是牝牛.牛們要站成一排.但是牡牛是好鬥的,為了避免牡牛鬧出亂子,約翰決定任意兩隻牡牛之間至少要有K(O≤K<N)只牝牛.     請計算一共有多少種排隊的方法.所有牡牛可以看成是相同的,所有牝牛也一樣.答案對5000011取模

Input

    一行,輸入兩個整數N和K.

Output

      一個整數,表示排隊的方法數.

Sample Input

4 2

Sample Output

6
樣例說明
6種方法分別是:牝牝牝牝,牡牝牝牝,牝牡牝牝,牝牝牡牝,牝牝牝牡,牡牝牝牡
 

(這題能用組合數寫來著.....) 設$f[i]$為第$i$個位置放牡牛的方案數 顯然$f[i]=\sum_{j=0}^{i-k-1}f[j]$ 字首和優化一下,你甚至發現可以把$f$陣列給省掉
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4
#define re register 5 using namespace std; 6 #define N 100002 7 const int mod=5000011; 8 int n,k,sum[N]; 9 int main(){ 10 scanf("%d%d",&n,&k); sum[0]=1; 11 for(int i=1;i<=n;++i) 12 sum[i]=(sum[i-1]+(i>k?sum[i-k-1]:1))%mod; 13 printf("%d",sum[n]); 14 return
0; 15 }
View Code