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;
}
posted @ 2025-05-12 17:13  Marinaco  阅读(16)  评论(0)    收藏  举报
//雪花飘落效果