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