E - Fruit Lineup
题目链接:https://atcoder.jp/contests/abc405/tasks/abc405_e
题意:
有A个a,B个b,C个c,D个d,其中a要放在c和d的前面,b要放在d的前面,求方案数
思路:
枚举第一个d的位置i,那么a和b一定在d前面的位置,c在d前面的位置的数量为第一个d的位置-A-B
先看第一个d前面的方案数
由于a要在c前面,所以不妨先放b。
当b放完之后,从前至后一定是先填完a在填c的顺序
所以前面的方案数为Com(i-1,b)
再看后面的方案数
只有两个元素,那么可以先放剩下的c,然后把d放完
所以后面的方案数为Com(n-i,x-c)
组合数,阶乘,阶乘逆元的预处理要会
int fact[maxn];
int infact[maxn];
int ksm(int a,int b,int p){
int res=1;
while(b){
if(b&1)res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
int com(int n,int r){
return (((fact[n]*infact[r])%mod)*infact[n-r])%mod;
}
void solve(){
int a,b,c,d;cin>>a>>b>>c>>d;
int res=0;
int n=a+b+c+d;
for(int i=a+b+1;i<=n-d+1;i++){
int banana_left=i-1-a-b;
int banana_right=c-banana_left;
res+=(com(i-1,b)*com(n-i,banana_right))%mod;
}
cout<<res%mod<<endl;
}

浙公网安备 33010602011771号