Combinatorics 组合数学 模板

//快速幂
ll qpow(ll x,ll n){
    ll res=1;
    while(n){
        if(n&1)
            res=res*x%p;
        x=x*x%p;
        n>>=1;
    }
    return res;
}

//乘法逆元 快速幂+费马小定理
ll inv(ll n){
    return qpow(n,p-2);
}

//线性求阶乘、阶乘乘法逆元
void init(int n){
    fac[0]=1;
    for(int i=1;i<=n;i++){
        fac[i]=fac[i-1]*i%p;
    }
    invfac[n]=qpow(fac[n],p-2);
    for(int i=n;i>=1;i--){
        invfac[i-1]=invfac[i]*i%p;
    }
}

//排列数
ll A(int n,int m){
    return fac[n]*invfac[m]%p;
}

//组合数
ll C(int n,int m){
    return fac[n]*invfac[n-m]%p*invfac[m]%p;
}

 1.隔板法

用于解决在两个球之间可以多次插入的问题:

当要求两个隔板间不必要有球时,那么就隔板和球加起来做一次全排列,假如隔板无差别就要除以隔板的排列,假如球无差别就要除以球的排列。

当要求两个隔板间一定要有球的时候,假如有k个隔板,那么分成k+1组,加入k+1个球,变成n+k+1,在球之间的n+k个空挡中选C(n+k,k)个位置排列入隔板,假如隔板无差别就要除以隔板的排列。

 

猜你喜欢

转载自www.cnblogs.com/Yinku/p/10285673.html