题目大意:
约翰要带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;
}