组合数学
最基础的:
\(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!
卢卡斯(\(\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;
}