最基础的:
(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^{ndiv p}_{mdiv 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;
}