组合数学

最基础的:
\(C^{m}_{n}=\frac{n!}{m!(n-m)!}\)
他的逆元算法是:
因为阶乘是\(fac[i]=fac[i-1]*i\)
所以阶乘逆元是\(invfac[n]=fac[n]^{p-2}\)
=>\(invfac[i-1]=invfac[i]*i\)

于是\(\color{#00CCFF}{C^{m}_{n}=fac[n]*invfac[n-m]%p*invfac[m]%p}\)

若将\(C^{m}_{n}\)分行我们就得到了伟大的杨辉Triangle!
triangle

卢卡斯(\(\color{white}{Greencas}\))定理

\(C^{m}_{n}=C^{n\div p}_{m\div p}*C^{n%p}_{m%p}\),p仍然还是质数

ll C(ll n,ll m)
{
    if(n<m)return 0;
    return (fac[n]*inv(fac[m]))%p*inv(fac[n-m])%p;
}
ll lucas(ll n,ll m)
{
    if(!m)return 1;
    return lucas( c(n/p,m/p),c(n%p,m%p) );
}

容斥定理

\(Ans=所有方案-不满足其中1个+不满足其中2个......+(-1)^n*不满足其中n个\)
例子:
错排问题:n把钥匙开n把锁,随机分配,全都打不开概率多少
胡乱分析:
我们有:1不在1,2不在2......n不在n
于是
\(\huge{\Sigma^{n}_{k=0} (-1)^k*Cn^k*A^{n-k}_{n-k}}\)
-----------------------------------------------------------------------------------------------------------------------

\(\huge{Catalan数}\)

可解:
进栈顺序、对角线划分方案数、二叉树形态
Catalan的推导方式为:
\(h(n)=h(0)*h(n-1)+h(1)+h(n-2)......+h(n-1)*h(0)\)
其中\(h(0)=1,h(1)=1\)
又有另一种写法:
\(h(n)=C^{n}_{2n} \div (n+1)\)
前七项为:
\(\huge{\color {red}{1,1,2,5,14,42,132}}\)

矩阵

矩阵乘法:
A为mn的矩阵,B为np矩阵,他们乘积C为m*p矩阵
\(c_{i,j}=a_{i,1}b_{1,j}+a_{i,2}b_{2,j}+······+a_{i,n}b{n,j}=\Sigma ^{n}_{r=1} a_i,b_{r,j}\)

struct martix{
    ll a[4][4],n,m;
}
martix multiply(martix a,martix b)
{
    martix ret;
    ret.n=a.n,ret.m=b.m;
    for(int i=1;i<=a.n;i++)
    {
        for(int j=1;j<=b.m;j++)
        {
            ret.a[i][j]=0;
            for(int k=1;k<=a.m;k++)
            {
                ret.a[i][j]+=a.a[i][k]*b.a[k][j];
                ret.a[i][j]%=mod;
            }
        }
    }
    return ret;
}
posted @ 2019-07-07 14:58  ComputerEngine  阅读(165)  评论(0编辑  收藏  举报