BZOJ 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛

题目大意:

约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛.
请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模

题解:

貌似没什么好说的,组合数一下

代码:

#include<cstdio>
using namespace std;
const int mod=5000011;
int ni[100005],mi[100005];
int pow(int a,int b){
	int ans=1;
	while (b){
		if (b&1) ans=1ll*ans*a%mod;
		a=1ll*a*a%mod;
		b=b>>1;
	}
	return ans;
}
int C(int n,int m){
	return 1ll*mi[m]*ni[n]%mod*ni[m-n]%mod;
}
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	mi[0]=1;
	for (int i=1; i<=n; i++) mi[i]=1ll*mi[i-1]*i%mod;
	ni[0]=1;
	for (int i=1; i<=n; i++) ni[i]=1ll*ni[i-1]*pow(i,mod-2)%mod;
	int ans=0;
	for (int A=1; n>=(A-1)*k+A; A++){
		int B=n-(A-1)*k-A;
		(ans+=C(A,A+B))%=mod;
	}
	printf("%d\n",(ans+1)%mod);
	return 0;
}

  

posted @ 2018-07-11 18:34  ~Silent  阅读(234)  评论(0编辑  收藏  举报
Live2D