组合数学
🪶两大原理
加法原理
一件事情可以分类完成。
\(\\\)
乘法原理
一件事情可以分步完成。
\(\\\)
\(\\\)
🪶公式
排列及计算公式
从\(n\)个不同的元素中取出\(m\)个拍成一列(考虑顺序)。
\(A_n^m=\frac{n!}{(n-m)!}\)
\(\\\)
组合及计算公式
从\(n\)个不同的元素中取出\(m\)个组成一个集合(不考虑顺序)。
\(C_n^m=\frac{n!}{(n-m)!m!}\)
一些性质
-
\(C_n^m=C_n^{n-m}\)
-
\(C_n^m=C_{n-1}^m+C_{n-1}^{m-1}\)
-
\(C_n^0+C_n^1+C_n^2+…+C_n^n=2^n\)
杨辉三角公式
递推公式\(c[i][j]=c[i-1][j]+c[i-1][j-1]\)。
c[0][0]=1;
c[1][0]=1;c[1][1]=1;
for(int i=2;i<=2010;i++){
c[i][0]=1;
for(int j=1;j<=i;j++){
c[i][j]=(c[i-1][j]%k+c[i-1][j-1]%k)%k;
}
}
第\(n\)行第\(m\)列代表\(C_{n}^{m}\),
\(\\\)
\(\\\)
\(\\\)
🪶计算组合数
前提条件:\(1\)~\(n\)都存在模\(p\)的乘法逆元
求\(C_n^m\)
- 先计算\(n!\) mod p
- 计算\(m!(n-m)!\) mod p的逆元
- 复杂度\(O(n)\)
\(\\\)
求\(C_j^i(j\le n,i\le m)\)
-
预处理出前缀积\(jc\%\) mod
-
计算出jc_inv\(_{n}\),递推出jc_inv\(_{1-n}\)
-
可以实现\(O(n)\)预处理,\(O(1)\)查询。
\(\forall i\epsilon[1,n] gcd(i,p)=1\),那么这些数中一些数的乘积与p的gcd也为1。
for(int i=1;i<=n;i++)
jc[i]=jc[i-1]*i%mod;
jc_inv[n]=qpow(jc[n],mod-2,mod);
for(int i=n;i>=1;i--)
jc_inv[i-1]=(jc_inv[i]*i)%mod;
\(\\\)\(\\\)
\(\\\)
\(\\\)
🪶二项式定理
\((a+b)^n=\sum_\limits{k=0}^{n}C_n^ka^kb^{n-k}\)
\(\\\)
\(\\\)
🪶多重集
多重集是指包含重复元素的广义集合。
设多重集\(S={n_1*a_1,n_2*a_2,…,n_k*a_k}\)是由\(n_1\)个\(a_1\),\(n_2\)个\(a_2\)…\(n_k\)个\(a_k\)组成的多重集。
排列数
\(\frac{n!}{n_1!n_2!…n_k!}\)
\(\\\)
组合数
设整数\(r\le n_i\ \forall i\epsilon[1,k]\)。从\(S\)中取出\(r\)个元素组成一个多重集,产生的不同多重集的数量为
\(C_{k+r-1}^{k-1}\)
\(\\\)
\(\\\)
🪶排列
圆排列
\(n\)个人围成一圈,全排列为\(\frac{n!}{(n-n)!\times n}=(n-1)!\)
\(n\)个人中选\(r\)个人围成一圈,部分排列为\(\frac{n!}{r!(n-r)!}\times(r-1)!=\frac{n!}{r\times (n-r)!}\)
\(\\\)
错排列
\(1\)~\(n\)个数全都不在对应的位置上
\(f[1]=0,f[2]=1,f(n)=(n-1)(f(n-1)+f(n-2))\)
\(\\\)
\(\\\)
🪶卡特兰数
本质上是匹配关系,给定\(n\)个\(0\)和\(n\)个\(1\),它们按照某种顺序排成长度为\(2n\)的序列,满足任意前缀中\(0\)的个数不少于\(1\)的个数的序列的数量。
递推公式:\(c[n]=\sum_{ k=0}^{n-1}c[k]c[n-k-1]\)
另类递推式:\(c[n]=\frac{c[n-1]\times (4n-2)}{n+1}\)
第\(0\)~\(5\)项:
1,1,2,5,14,42
以下问题都与卡特兰数有关:
- \(1,2,…,n\)经过一个栈,合法
- \(n\)个左括号和\(n\)个右括号组成的合法括号序列的数量
- \(n\)个节点构成的不同二叉树的数量
- 在平面直角坐标系上每一步,只能向上走或向右走,从\((0,0)\)走到\((n,n)\)并且出两个端点外不接触直线\(y=x\)的路线数量为\(2Cat_{n}\)
\(\\\)
\(\\\)
🪶鸽巢原理
将\(kn+1\)个物体,划分为\(n\)组,那么至少一组有\(k+1\)个(或以上)的物品。
\(\\\)
\(\\\)
🪶容斥原理
设\(S_1,S_2,…,S_n\)为有限集合,\(|S|\)表示集合大小,则:
\(\left | \bigcup\limits_{i=1}^{n}S_i \right | =\sum_\limits{i=1}^{n}|S_i|-\sum_\limits{1\le i<j\le n}\left | S_i\bigcap S_j\right | +\sum\limits_{1\le i<j<k\le n}\left | S_i\bigcap S_j\bigcap S_k\right |+…(-1)^{n+1}\left | S_i\bigcap …\bigcap S_n\right |\)

浙公网安备 33010602011771号