BZOJ3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛

标签:DP,组合数学

Time Limit: 1 Sec  Memory Limit: 128MB
Submit: 335  Solved: 235
[Submit][Status][Discuss]

Description

    约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K只牝牛.

    请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模

Input

    一行,输入两个整数NK.

Output

    一个整数,表示排队的方法数.

Sample Input

    4  2

Sample Output

    6

样例说明

    6种方法分别是:牝牝牝牝,牡牝牝牝,牝牡牝牝,牝牝牡牝,牝牝牝牡,牡牝牝牡

 

DP裸题,一眼秒掉

F[i]=f[i-1]+f[i-k-1]

震惊!hzwer竟然用奇奇怪怪的组合数学写

 

Code

#include
#include
#include
#include
#include
#include
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define mem(x,num) memset(x,num,sizeof x)
#define LL long long
using namespace std;
inline LL read()
{
	LL f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
const int maxn=1e7+6,mod=5000011;
int n,k,f[maxn];
int main()
{
	n=read(),k=read();
	f[1]=2;
	k++;
	rep(i,2,n)f[i]=(f[i-1]+(i>k?f[i-k]:1))%mod;
	cout<

你可能感兴趣的:(DP,bzoj,OI成长历程)