BZOJ3398[Usaco2009 Feb]Bullcow 牡牛和牝牛

xiaoxiao2021-02-28  21

标签:DP,组合数学

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

Description

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

    请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对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<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #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<<f[n]<<endl; return 0; }

转载请注明原文地址: https://www.6miu.com/read-1999965.html

最新回复(0)