排列组合
四个计数原理
-
加法原理:并列的方案数加和。
-
乘法原理:叠加的方案数相乘。
-
减法原理:正难则反,补集转换。
-
除法原理:目测用处不大。
排列组合定义式
\[\mathrm{A}_n^m=\dfrac{n!}{(n-m)!},\mathrm{C}_n^m=\dbinom{n}{m}=\dfrac{n!}{m!(n-m)!}
\]
组合数的一些变换 \(1\)
最基本的对称性:
\[\dbinom{n}{m}=\dbinom{n}{n-m}
\]
根据定义得到:
\[\dbinom{n}{k}=\dfrac{n}{k}\dbinom{n-1}{k-1}
\]
可以考虑组合意义的一个变换:
\[\dbinom{n}{m}\dbinom{m}{k}=\dbinom{n}{k}\dbinom{n-k}{m-k}
\]
根据杨辉三角得到:
\[\dbinom{n}{m}=\dbinom{n-1}{m-1}+\dbinom{n-1}{m}
\]
进而推出(考虑杨辉三角上一纵列):
\[\sum_{i=0}^n \dbinom{i}{k}=1+\sum_{i=k+1}^{n} \dbinom{i}{k}=\dbinom{k+1}
{k+1}+\sum_{i=k+1}^{n} \dbinom{i}{k}=\dbinom{n+1}{k+1}\]
Lucas 定理
\[\dbinom{n}{m}\equiv \dbinom{n\bmod p}{m\bmod p}\dbinom{\left\lfloor n/p \right\rfloor}{\left\lfloor m/p \right\rfloor} \pmod p
\]
证明:
\[(k+1)^{p}\equiv k^p+1\pmod p
\]
求组合数实际上就是求一个二项式的某一项,将 \(n,m\) 分解,\(n=ap+b,m=cp+d\)
\[\begin{aligned}
(k+1)^{n}&\equiv(k+1)^{ap}(k+1)^b\\
&\equiv(k^p+1)^a(k+1)^b \pmod p
\end{aligned}\]
而 \(m\) 项就是:
\[\dbinom{n}{m} k^m=\dbinom{a}{c} k^{cp} \dbinom{b}{d} k^d
\]
所以上式成立。
于是在模 \(p\) 定义下,组合数可以拆分成 \(p\) 进制类的数。
组合数的一些求法
-
规模小数量多:杨辉三角预处理。
-
规模数量适中:预处理阶乘以及逆元。
-
规模大:Lucas 定理
特殊组合数 \(1\)
- 多重集排列数(\(x_i\) 个 \(a_i\) 组成的本质不同序列个数):
\[\dbinom{n}{x_1,x_2,\cdots ,x_k}=\dfrac{n!}{\prod_{i=1}^k x_i!}
\]
- 无限多重集组合数:等价于求 \(\sum_{i=1}^k x_i=n\) 非负整数解的个数。令 \(y_i=x_i+1\),就是在求 \(\sum_{i=1}^k y_i=n+k\) 的正整数解个数,后者可以插板法:
\[\dbinom{n+k-1}{k-1}
\]
\[\mathrm{Q}_n^m=\dfrac{\mathrm{A}_n^m}{m}
\]
二项式系数
二项式定理
\[(x+y)^n=\sum_{i=0}^n \dbinom{n}{i} x^iy^{n-i}
\]
证明考虑组合意义,从 \(n\) 个 \(x\) 中选取 \(i\) 个,其余为 \(y\) 的方案数即为某一项的系数。
组合数的一些变换 \(2\)
二项式定理的两个特殊情况:
\[\sum_{i=0}^n \dbinom{n}{i}=2^n
\]
\[\sum_{i=0}^n (-1)^i\dbinom{n}{i}=[n=0]
\]
对上一个式子中 \(n\ge 1\) 前提下的进一步解释:按考虑 \(i\) 的奇偶两边展开,也就是 \(n\) 个数选取奇数个和偶数个的方案数,显然前 \(n-1\) 个任意选,最后一个按照要求补全即可,于是两边都是 \(2^{n-1}\)。
一个加权的式子:
\[\sum_{i=1}^ni\dbinom{n}{i}=n2^{n-1}
\]
第一种证明是基于上面提出一个分式的转换:
\[\sum_{i=1}^n i\dbinom{n}{i}=\sum_{i=1}^n i\times \dfrac{n}{i}\dbinom{n-1}{i-1}=\sum_{i=0}^{n-1}n\dbinom{n-1}{i}=n2^{n-1}
\]
也可以写成二项式再求导:
\[\begin{aligned}
\sum_{i=0}^n\dbinom{n}{i} x^i&=(1+x)^n\\
\sum_{i=1}^n i\dbinom{n}{i} x^{i-1}&=n(1+x)^{n-1}
\end{aligned}\]
代入 \(x=1\),即证。
接下来考虑扩展到 \(i^2\),在代入前式子的基础上处理:
\[\begin{aligned}
\sum_{i=1}^n i\dbinom{n}{i} x^i&=n(1+x)^{n-1}x\\
\sum_{i=1}^n i^2\dbinom{n}{i} x^{i-1}&=n[(n-1)(1+x)^{n-2}x+(1+x)^{n-1}]
\end{aligned}\]
同样代入 \(x=1\),得到:
\[\sum_{i=1}^n i^2\dbinom{n}{i}=n(n+1)2^{n-2}
\]
容斥原理
经典容斥模型
集合 \(U\) 中每个元素都满足一些属性 \(P\),其中满足属性 \(P_i\) 的元素构成了集合 \(A_i\),现在给定集合 \(S\),欲求出至少满足 \(S\) 中一种属性的元素个数(并集),以及同时满足 \(S\) 中所有属性的元素个数(交集)。
\[\left|\bigcup_{i\in S} A_i\right|=\sum_{T\subseteq S,T\neq \varnothing} (-1)^{|T|-1}\left|\bigcap_{j\in T} A_j\right|
\]
若求交集只需做一个补集转换:
\[\left|\bigcap_{i\in S} A_i\right|=|U|-\left|\bigcup_{i\in S} \overline{A_i}\right|
\]
我们现在对这个模型给出证明,目的是证明每个符合条件的元素都不重不漏的只计算了一次。
考虑前面二项式中选择个数为偶数奇数方案数的例子,和这里是有相同之处的,对于一个元素 \(i\),其满足的属性集合为 \(B_i\),那么当且仅当 \(T\subseteq B_i\) 是才会对 \(i\) 的数量产生影响,也就是枚举 \(B_i\) 的非空子集。
而这里恰好就是选取奇数做正贡献,选取偶数做负贡献,而空集情况已经排除,那么奇数贡献正好比偶数多 \(1\),即证不重不漏。
所以容斥最好的地方在于,正常求解对属性卡的非常严,而转化成交集后,只需考虑给出的部分满足,不需要考虑不给出的部分不满足。
特殊组合数 \(2\)
- 有限多重集组合数(每个元素有一个 \(n_i\) 的数量限制):考虑容斥,要求每个限制都满足,可容斥求至少一个限制不满足的方案,即枚举每一个超出限制的集合,其方案数是总数削去所有超过限制元素的 \(n_i+1\) 后的普通答案。
\[\dbinom{n+k-1}{k-1}-\sum_{T\subseteq U,T\neq \varnothing} (-1)^{|T|-1} \dbinom{n+k-\sum_{i\in T} (n_i+1)-1}{k-1}
\]
使用容斥原理的通项式:
\[\begin{aligned}
D_n&=n!-\sum_{k=1}^n (-1)^{k-1}\dbinom{n}{k}(n-k)!\\
&=n!-n!\sum_{k=1}^n \dfrac{(-1)^{k-1}}{k!}\\
&=n!\sum_{k=0}^n\dfrac{(-1)^k}{k!}
\end{aligned}\]
于是简单推导可以得出第一个递推式:
\[D_n=nD_{n-1}+(-1)^n
\]
如果考虑组合意义可以得出第二个递推式:
\[\begin{cases}
D_1=0\\
D_2=1\\
D_n=(n-1)(D_{n-1}+D_{n-2})&n\ge 3
\end{cases}\]
考虑满足条件的排列第一个数字取值为 \([2,n]\),因此实际是钦定 \(2\) 为首个数字后的方案数的 \(n-1\) 倍。
当第二位上是 \(1\) 时,后面 \(n-2\) 个位置就是标准的错排,也就是 \(D_{n-2}\),当第二位上不是 \(1\) 是,后面 \(n-1\) 个位置各自有自己的限制(\(1\) 不能出现在第二位,其余不能出现在对应位置),也就是 \(D_{n-1}\),即证上式。
子集反演
\[f(S)=\sum_{T\subseteq S}g(T)\Leftrightarrow g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T)
\]
\[f(S)=\sum_{S\subseteq T}g(T)\Leftrightarrow g(S)=\sum_{S\subseteq T}(-1)^{|T|-|S|}f(T)
\]
正确性直接代入即可。
二项式反演
考虑容斥模型中大小相同的集合对应函数值相等的特殊情况,令 \(f(n)\) 表示同时满足 \(n\) 个条件对应原集的方案数,\(g(n)\) 表示 \(n\) 个满足 \(n\) 个条件对应补集的方案数,其中 \(f(0)=g(0)=|U|\)。
由容斥模型:
\[\left|\bigcap_{i\in S} A_i\right|=|U|-\left|\bigcup_{i\in S} \overline{A_i}\right|=|U|+\sum_{T\subseteq S,T\neq \varnothing} (-1)^{|T|}\left|\bigcap_{j\in T} \overline{A_j}\right|
\]
\[f(n)=g(0)+\sum_{i=1}^n(-1)^i\dbinom{n}{i} g(i)=\sum_{i=0}^n(-1)^i\dbinom{n}{i} g(i)
\]
而原集与补集是相对概念,\(f\) 与 \(g\) 彼此的表达形式应当相同。
\[f(n)=\sum_{i=0}^n(-1)^i\dbinom{n}{i} g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^i\dbinom{n}{i} f(i)
\]
把左式的 \((-1)^i\) 并入 \(g(i)\) 中,得到:
\[f(n)=\sum_{i=0}^n \dbinom{n}{i} g(i)\Leftrightarrow g(n)=\sum_{i=0}^n (-1)^{n-i}\dbinom{n}{i} f(i)
\]
证明可以直接代入,运用组合数的恒等式。
继续扩展得到:
\[f(n)=\sum_{i=m}^n \dbinom{n}{i} g(i)\Leftrightarrow g(n)=\sum_{i=m}^n (-1)^{n-i}\dbinom{n}{i} f(i)
\]
\[f(n)=\sum_{i=n}^m \dbinom{i}{n} g(i)\Leftrightarrow g(n)=\sum_{i=n}^m (-1)^{i-n}\dbinom{i}{n} f(i)
\]
这里 \(f\) 与 \(g\) 的定义与容斥中的类似,分别表示钦定和恰好,恰好不用解释,而钦定不是至少,是 存在重复方案的,即枚举每个大小相等的子集,在保证满足这个子集的前提下其余任意,这样的方案数之和。
二项式反演可以同样可以由子集反演得到(是特殊情况)。
min-max 容斥
先放出式子:
\[\max_{i\in S} x_i =\sum_{T\subseteq S,T\neq \varnothing} (-1)^{|T|-1} \min_{j\in T} x_j
\]
\[\min_{i\in S} x_i =\sum_{T\subseteq S,T\neq \varnothing} (-1)^{|T|-1} \max_{j\in T} x_j
\]
用语言描述就是:一个集合的最值等于其所有非空子集的另一最值做出的容斥。
证明考虑对于从小到大第 \(k\) 的值,映射到一个 \([1,k]\) 的整数集合,取 \(\min\) 等价于集合取交集,而 \(\max\) 等价于取并集,这样相当于是就全集映射到的集合之并,自然等价于各个子集映射到的集合之交。
思考 \(\min\) 与 \(\max\) 同时总能想到 \(\gcd\) 与 \(\mathrm{lcm}\),于是有:
\[\mathrm{lcm}_{i\in S} x_i=\prod_{T\subseteq S,T\neq \varnothing} \left(\gcd_{j\in T} x_j\right)^{(-1)^{|T|-1}}
\]
另外期望具有线性性,于是,就可以有:
\[E\left(\max_{i\in S} x_i\right) =\sum_{T\subseteq S,T\neq \varnothing} (-1)^{|T|-1} E\left(\min_{j\in T} x_j\right)
\]
这个用处很大,对于期望的问题,有时要求满足多个条件的期望,即求最大值的期望,而这往往不好求,相对简单的是去求一个集合的最小值期望,这是我们只需要关心什么时候首次满足条件即可。
特殊计数序列
Catalan 数
考虑一个由 \(n\) 个 \(+1\) 和 \(n\) 个 \(-1\) 构成的序列,要求这个序列任意一个前缀和都是非负数,求序列个数。
容易得到总的序列个数应当为 \(\mathrm{C}_{2n}^{n}\),现在想要求出不合法的方案数。
对于一个不合法序列,找到第一个不满足的位置,截至这个位置的前缀是 \(k\) 个 \(+1\) 与 \(k+1\) 个 \(-1\) 组成的,把这个前缀每个位置取相反数,从而得到一个 \(n+1\) 个 \(+1\) 和 \(n-1\) 个 \(-1\) 构成的序列,这样的序列有:\(\mathrm{C}_{2n}^{n+1}\) 个。
得到 Catalan 数的第一个表达式:
\[C_n=\dbinom{2n}{n}-\dbinom{2n}{n+1}=\dfrac{\dbinom{2n}{n}}{n+1}
\]
进一步可以得到递推式:
\[C_n=\dfrac{4n-2}{n+1} C_{n-1}
\]
考虑 Catalan 数的组合意义就是上面提到的 \(+1\) 与 \(-1\) 序列,概括的说是在任意时刻,一种元素的个数总是不少于另一种,于是得到两个比较经典的模型:
-
从 \((0,0)\) 走到 \((n,n)\),每次可以纵向或横向增加一个单位,要求任意时刻所在位置 \((x,y)\) 保证 \(x\ge y\),求方案数。(横向移动次数不少于纵向移动次数)
-
\(n\) 对括号构成的合法括号序列方案数。(左括号个数不少于右括号个数)
-
\(n\) 个元素入栈出栈顺序。(入栈次数不少于出栈次数)
对于上面的第二个例子,我们单独拿出最左侧的左括号以及其对应的右括号,这样会将整个括号序列划分成两个互不影响的合法子序列,枚举两个子序列大小得到:
\[C_n=\sum_{i=0}^{n-1} C_i\times C_{n-1-i}
\]
观察这种划分成两个部分的组合意义,这等价于 \(n\) 个节点构成二叉树的方案数。
第一类 Stirling 数
定义
定义 \(\begin{bmatrix}n\\m\end{bmatrix}\) 为第一类 Stirling 数,将 \(n\) 个元素形成 \(m\) 个圆排列(两个圆之间无顺序差别)的方案数,
递推式:
\[\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\m\end{bmatrix}
\]
性质
每个圆排列集合都唯一对应一个置换(每个圆是一个循环置换),而置换有 \(n!\) 个,于是:
\[\sum_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}=n!
\]
上升幂转普通幂:
\[x^{\overline{n}}=\sum_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix} x^i
\]
归纳法证明:
\[\begin{aligned}
x^{\overline{n+1}}&=x^{\overline{n}}\times(x+n)\\
&=\sum_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix} x^i\times (x+n)\\
&=\sum_{i=0}^{n+1} \begin{bmatrix}n\\i-1\end{bmatrix} x^i +\sum_{i=0}^n n\begin{bmatrix}n\\i\end{bmatrix} x^i\\
&=\sum_{i=0}^{n+1} \begin{bmatrix}n+1\\i\end{bmatrix} x^i
\end{aligned}\]
由于上升幂与下降幂的关系:
\[x^{\overline{n}}=(-1)^n\times (-x)^{\underline{n}}
\]
\[x^{\underline{n}}=(-1)^n\times (-x)^{\overline{n}}
\]
代入到上面即可得到下降幂转普通幂:
\[x^{\underline{n}}=\sum_{i=0}^n (-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}x^i
\]
第二类 Stirling 数
定义
定义 \(\begin{Bmatrix}n\\m\end{Bmatrix}\) 为第一类 Stirling 数,将 \(n\) 个元素划分到 \(m\) 个非空集合(两个集合之间无顺序差别)的方案数。
递推式:
\[\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\begin{Bmatrix}n-1\\m\end{Bmatrix}
\]
使用二项式反演可得另一通项公式:
设 \(g_n(m)\) 为 \(n\) 个元素放入 \(m\) 个集合(可以为空,两个集合之间有顺序差别)的方案数,显然 \(g_n(m)=m^n\)。
而 \(f_n(m)\) 为 \(n\) 个元素放入 \(m\) 个集合(不能为空,两个集合之间有顺序差别)的方案数,有:
\[g_n(m)=\sum_{i=0}^m \dbinom{m}{i} f_n(i)
\]
二项式反演得到:
\[f_n(m)=\sum_{i=0}^m (-1)^{m-i} \dbinom{m}{i} g_n(i)
\]
\(f\) 与第二类 Stirling 数的唯一区别是集合是否有顺序差别,也就是:
\[\begin{Bmatrix}n\\m\end{Bmatrix}=\dfrac{f(m)}{m!}=\sum_{i=0}^m\dfrac{(-1)^{m-i} i^n}{i!(m-i)!}
\]
性质
普通幂转下降幂(或者是组合数):
\[x^n=\sum_{i=0}^n \begin{Bmatrix}n\\i\end{Bmatrix} x^{\underline{i}}=\sum_{i=0}^n \begin{Bmatrix}n\\i\end{Bmatrix} i!\dbinom{x}{i}=\sum_{i=0}^n \dbinom{x}{i}\sum_{j=0}^i\dbinom{i}{j}(-1)^{i-j}j^n
\]
这里证明可以用组合意义,\(x^n\) 即为 \(n\) 个元素放入 \(x\) 个有顺序差别集合中的方案数,枚举有 \(i\) 个集合非空,其选取方案、放置方案以及顺序差别三者的积即为上式。
实际应用中,通常转为组合数后进行组合数的变换。
同样的方式得到普通幂转上升幂:
\[x^n=\sum_{i=0}^n (-1)^{n-i}\begin{Bmatrix}n\\i\end{Bmatrix}x^{\overline{i}}
\]
参考资料