组合数学与计数(瞎写)
组合数学与计数
笔记,不含练习。
基本计数原理
加法原理
乘法原理
组合数
\(\binom{n}{r}\) 或 \(C_{n}^{r}\) 表示组合数,从 \(n\) 个元素中选 \(r\) 个的方案数,不考虑顺序。\(\binom{n}{r}=C_n^r=\frac{n!}{r!(n-r)!}\)。
类似的,\(A_{n}^{r}\) 表示排列数,从 \(n\) 个元素中选择 \(r\) 个的方案数,考虑顺序。\(A_n^r=\frac{n!}{(n-r)!}\)。
一些性质
对称恒等式
吸收提取不等式
与下降幂结合
加法归纳恒等式
二项式定理
下降幂转组合数
三项式版恒等式
范德蒙德卷积
插板法
现有 \(n\) 个完全相同的元素,要求将其分为 \(k\) 组,保证每组至少有一个元素,一共有多少种分法?
考虑拿 \(k-1\) 块板子插入到 \(n\) 个元素两两形成的 \(n-1\) 个空里面。
因为元素是完全相同的,所以答案就是 \(\binom{n-1}{k-1}\)。
本质是求 \(k\) 个未知数和为 \(n\) 的正整数解的组数。
允许每组为空?
考虑加入 \(k-1\) 个元素,这样有 \(n+k-1\) 个元素。考虑从中选 \(k-1\) 个作为板子进行分隔。
答案即为 \(\binom{n+k-1}{k-1}\)。
本质是求 \(k\) 个未知数和为 \(n\) 的非负整数解的组数。
如果再扩展一步,要求对于第 \(i\) 组,至少要分到 \(a_i\),\(\sum a_i\le n\) 个元素呢?
考虑先把下界补满,然后问题就转换为允许每组为空的了。
答案即为 \(\binom{n-\sum a_i+k-1}{k-1}\)。
二项式求导
计算 \(\sum_{k=1}^nk^2\binom{n}{k}\)。
考虑 \(ax^n\) 的导数等于 \(anx^{n-1}\)。
由二项式定理得:
两边同时求导:
两边同乘 \(x\):
两边同时求导:
将 \(x=1\) 带入得到:
组合数取模
卢卡斯定理:
例题
\(n\) 个不同元素,选 \(r\) 个,每个可以选择多次(类似多重背包)。求方案数。
这个问题等价于 \(n\) 个未知数和为 \(r\) 的方案数。引用上面的结论即可。
\(n\) 个不同元素,选 \(r\) 个,选的元素不能相邻。
考虑空格的分配。
\(r\) 个元素,显然有 \(r+1\) 个空格(算上两边),其中,两头的两个的空格最少可以是 \(0\) 个格子,中间的空格最少是 \(1\) 个格子。
因为要选 \(r\) 个物品,所以有 \(n-r\) 个格子是空格。
问题转化为 \(r+1\) 个未知数,和为 \(n-r\),其中 \(r-1\) 个下界为 \(1\),剩下的两个下界为 \(0\)。
套用上面的公式,答案即为 \(\binom{n-r-(r-1)+(r+1)-1}{(r+1)-1}=\binom{n-r+1}{r}\)。
求 \(\sum_{k=0}^n\binom{n}{k}^2\)。
考虑 \(\binom{n}{k}=\binom{n}{n-k}\),那么上式变为 \(\sum_{k=0}^n\binom{n}{k}\binom{n}{n-k}\)。
就相当于把 \(2n\) 个物品分成两段,枚举前面半段选多少,后面半段选多少。
显然等于 \(\binom{2n}{n}\)。
将 \(x\) 拆分为 \(n\) 个不同的组合数之和,求一组合法方案。
\(x=\sum_{i=1}^{k-1}\binom{i}{0}+\binom{x-k+1}{1}\)。
比较 \(\binom{n_1}{m_1}\) 和 \(\binom{n_2}{m_2}\) 的大小,\(n,m\le 10^6\)。
预处理阶乘的 \(\log\),比较 \(\log\) 的大小。
错排
设 \(D_n\) 表示 \(n\) 个元素错排的方案数。
如果 \(n=0\),只能啥也不干,所以 \(D_0=1\)。
如果 \(n=1\),没法错排,所以 \(D_1=0\)。
如果 \(n=2\),只能交换两个元素,所以 \(D_2=1\)。
考虑加入第 \(n\) 个元素,假设放在了第 \(i\) 个位置。显然有 \((n-1)\) 个 \(i\) 可选。
对于每个 \(i\),考虑第 \(i\) 号元素放在哪。
- 放在 \(n\) 号位置。这样剩下的 \((n-2)\) 个元素错排即可。
- 不放在 \(n\) 号位置。因为 \(i\) 不能放在 \(n\),而且因为原先的 \(i\) 位置被占用,就相当于没有,那么 \(n\) 号位置就相当于 \(i\) 号位置。这样 \((n-1)\) 个元素错排即可。
综上,\(D_n=(n-1)(D_{n-1}+D_{n-2})\)。
斯特林数
第二类
\(\begin{Bmatrix}n\\m\end{Bmatrix}\) 表示把 \(n\) 个元素划分成 \(m\) 个不可区分的非空集合的方案数。
转移
\(0\) 个东西放在 \(0\) 个集合里面只能啥也不干,所以 \(\begin{Bmatrix}0\\0\end{Bmatrix}=1\)。
考虑加入一个元素。
如果这个元素放在一个独立的集合内,有一种方案,剩下的部分有 \(\begin{Bmatrix}n-1\\m-1\end{Bmatrix}\) 种。
如果放在一个已有的集合内,有 \(k\) 种方案,剩下的部分有 \(\begin{Bmatrix}n-1\\m-1\end{Bmatrix}\) 种方案。
所以:
第一类
\(\begin{bmatrix}n\\m\end{bmatrix}\) 表示把 \(n\) 个元素划分成 \(m\) 个不可区分的非空轮换的方案数。
一个轮换就是一个首尾相接的环形排列。
我们可以写出一个轮换 \([A,B,C,D]\),并且我们认为 \([A,B,C,D]=[B,C,D,A]=[C,D,A,B]=[D,A,B,C]\),即,两个可以通过旋转而互相得到的轮换是等价的。
注意,我们不认为两个可以通过翻转而相互得到的轮换等价,即 \([A,B,C,D]\neq[D,C,B,A]\)。
转移
\(0\) 个东西放在 \(0\) 个轮换里面只能啥也不干,所以 \(\begin{bmatrix}0\\0\end{bmatrix}=1\)。
考虑加入一个元素。
如果这个元素放在一个独立的轮换内,有一种方案,剩下的部分有 \(\begin{bmatrix}n-1\\m-1\end{bmatrix}\) 种。
如果放在一个已有的集合内,有 \((n-1)\) 种方案,剩下的部分有 \(\begin{bmatrix}n-1\\m-1\end{bmatrix}\) 种方案。
所以:
通常幂和下降幂的转换
下降幂转通常幂:
通常幂转下降幂:
容斥
通过集合交的大小,求出集合并的大小。
设 \(U\) 中元素有 \(n\) 种不同的属性,而第 \(i\) 种属性称为 \(P_i\),拥有属性 \(P_i\) 的元素构成集合 \(S_i\),那么:
错排
这里有 \(n\) 个条件,形如 \(i\) 在正确的位置上。
显然,错排方案数=全排列-有至少一个在正确的位置上的的方案数。
考虑如何求出有至少一个在正确的位置上的方案数。
考虑容斥。满足任意 \(k\) 个条件的方案数是:\(\binom{n}{k}\times (n-k)!=\frac{n!}{k!}\),容斥系数为 \(k-1\)。
综上,错排方案数为:
但是这个式子就算预处理逆元都是 \(\Theta(n)\) 的,而且 \(\Theta(n)\) 的时间只能求一项,没啥用。
卡特兰数
介绍
以下问题属于Catalan数列:
- 有 \(2n\) 个人排成一行进入剧场。入场费 \(5\) 元。其中只有 \(n\) 个人有一张 \(5\) 元钞票,另外 \(n\) 人只有 \(10\) 元钞票,剧院无其它钞票,问有多少种方法使得只要有 \(10\) 元的人买票,售票处就有 \(5\) 元的钞票找零?
- 一位大城市的律师在她住所以北 \(n\) 个街区和以东 \(n\) 个街区处工作。每天她走 \(2n\) 个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
- 在圆上选择 \(2n\) 个点,将这些点成对连接起来使得所得到的 \(n\) 条线段不相交的方法数?
- 对角线不相交的情况下,将一个凸多边形区域分成三角形区域的方法数?
- 一个栈(无穷大)的进栈序列为 \(1,2,3,\cdots,n\) 有多少个不同的出栈序列?
- \(n\) 个结点可构造多少个不同的二叉树?
- \(n\) 个 \(+1\) 和 \(n\) 个 \(-1\) 构成 \(2n\) 项 \(a_1,a_2,\cdots,a_{2n}\),其部分和满足 \(a_1+a_2+\cdots+a_k \geq 0\)(\(k=1,2,3,\cdots,2n\))。对于 \(n\),该数列为?
其对应的序列为:
\(H_0\) | \(H_1\) | \(H_2\) | \(H_3\) | \(H_4\) | \(H_5\) | \(H_6\) |
---|---|---|---|---|---|---|
\(1\) | \(1\) | \(2\) | \(5\) | \(14\) | \(42\) | \(132\) |
这就是卡特兰数列。
计算
卡特兰数的递推式为:
\(H_n = \sum_{i=0}^{n-1} H_i \cdot H_{n-i-1} \quad (n \geq 2)\)
其中 \(H_0 = 1\),\(H_1 = 1\)。
其他常见的公式有:
非降路径计数
非降路径是指只能向上或向右走的路径。
- 从 \((0,0)\) 到 \((m,n)\) 的非降路径数等于 \(m\) 个 \(x\) 和 \(n\) 个 \(y\) 的排列数,即 \(\binom{n + m}{m}\)。
- 从 \((0,0)\) 到 \((n,n)\) 的除端点外不接触直线 \(y=x\) 的非降路径数:
先考虑 \(y=x\) 下方的路径,都是从 \((0, 0)\) 出发,经过 \((1, 0)\) 及 \((n, n-1)\) 到 \((n,n)\),可以看做是 \((1,0)\) 到 \((n,n-1)\) 不接触 \(y=x\) 的非降路径数。
所有的的非降路径有 \(\binom{2n-2}{n-1}\) 条。对于这里面任意一条接触了 \(y=x\) 的路径,可以把它最后离开这条线的点到 \((1,0)\) 之间的部分关于 \(y=x\) 对称变换,就得到从 \((0,1)\) 到 \((n,n-1)\) 的一条非降路径。反之也成立。从而 \(y=x\) 下方的非降路径数是 \(\binom{2n-2}{n-1} - \binom{2n-2}{n}\)。根据对称性可知所求答案为 \(2\binom{2n-2}{n-1} - 2\binom{2n-2}{n}\)。 - 从 \((0,0)\) 到 \((n,n)\) 的除端点外不穿过直线 \(y=x\) 的非降路径数:
用类似的方法可以得到:\(\frac{2}{n+1}\binom{2n}{n}\)。
如果要求只能在直线的下方和直线上走,则方案数是 \(\frac{1}{n+1}\binom{2n}{n}\),即卡特兰数。
问题
有一个函数 \(f(i,j)=f(i-1,j)+f(i,j-1),f(0,0)=1,0\le i\le j\),证明:\(f(n,n)=Catalan(n)\)。
容易发现,\(f(i,j)=f(i-1,j)+f(i,j-1),0\le i\le j\) 就是求 \((0,0)\) 走到 \((i,j)\) ,始终在 \(y=x\) 下方和 \(y=x\) 上走的方案数的递推式。这个就是卡特兰数。
板子
下降幂
int dpow(int a,int b){
int ans=1;
for(int i=0;i<b;i++)ans=ans*(a-i)%mod;
return ans;
}
快速幂
int ksm(int a,int b){
int ans=1;
for(;b;b>>=1){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
}
return ans;
}
逆元
int inv(int a){
int ans=1;
for(int i=mod-2;i;i>>=1){
if(i&1)ans=ans*a%mod;
a=a*a%mod;
}
return ans;
}
组合数
int C(int a,int b){
return fact[a]*inv(fact[b])%mod*inv(fact[a-b])%mod;
}