组合数学学习笔记(二):鸽巢原理、容斥及反演
鸽巢原理
将 \(\displaystyle\sum_{i = 1}^n p_i - n + 1\) 个物品放入 \(n\) 个盒子,一定存在一个盒子 \(i\),使得第 \(i\) 个盒子至少装了 \(p_i\) 个物品。
证明:考虑反证法。
假设每个盒子 \(i\) 都装了小于 \(p_i\) 个物品,那么物品数量最大当且仅当每个盒子 \(i\) 都装了 \(p_i - 1\) 个物品,那么物品数就是 \((p_1 - 1) + (p_2 - 1) + (p_3 - 1) + \dots + (p_n - 1) = \displaystyle\sum_{i = 1}^n p_i - n\),此时物品数小于物品总数,矛盾,因此 一定存在一个盒子 \(i\),使得第 \(i\) 个盒子至少装了 \(p_i\) 个物品。
推论: 如果把 \(n(r - 1) + 1\) 个物品放入 \(n\) 个盒子中,那么一定有一个盒子中至少装了 \(r\) 个物品。
证明:把所有的 \(p_i\) 取成一样就可以了。
练习一
有十个数 \(a_1, a_2, \dots a_{10}\) 满足 \(\forall_{1 \leq i \leq 10}{1 \leq a_i \leq 60}\),证明能够从 \(a_i\) 中挑出两个交为空的子集,使得它们的和相等。
证明:首先,由于 \(1 \leq a_i \leq 60\),那么这个子集的和就有可能是 \(0\) 到 \(600\) 这 \(601\) 个数中的一个,而可能的子集数为 \(2^{10} = 1024\),根据鸽巢原理,一定有两个子集的和相等。
如果这两个集合没有交集,那么已经满足题目的要求;如果这两个集合有交集,那就将这两个集合同时减掉交集,此时两个集合的和依然相等,而且仍然为全集的子集,原命题证明成立。
练习二
证明一张有超过 \(1\) 个点的简单无向图必定有两点度数相等。
解:考虑反证法。
一个 \(n\) 个点的简单无向图,每个点的度数是 \(0\) 到 \(n - 1\) 中的一个,假设这 \(n\) 个点的度数恰好是 \(0\) 到 \(n - 1\) 各一个,但由于度数为 \(n - 1\) 的点一定向其它 \(n - 1\) 个点个连了一条边,因此不存在度数为 \(0\) 的点,矛盾。于是度数 \(0\) 和 \(n - 1\) 不能同时出现,因此度数的选择只有 \(n - 1\) 种。
根据鸽巢原理,这 \(n\) 个点中一定有两个点度数相等,原命题证明成立。
练习三
证明能从任意 \(11\) 个实数中挑选出 \(4\) 个数 \(a, b, c, d\) 满足:
\((ac + bd)^2 \geq \displaystyle\frac 12(a^2 + b^2)(c^2 + d^2)\)
证明:考虑两个向量 \(u = \begin{bmatrix} a \\ b \end{bmatrix}, v = \begin{bmatrix} c \\ d \end{bmatrix}\),它们的点积为 \(\begin{bmatrix} a \\ b \end{bmatrix} \cdot \begin{bmatrix} c \\ d \end{bmatrix} = ac + bd\),那么右边又可以改写成 \((u \cdot v)^2\) 这是左边的几何含义。
这两个向量的模长分别是 \(\sqrt{a^2 + b^2}\) 和 \(\sqrt{c^2 + b^2}\),那么右边又可以改写成 \(\displaystyle\frac 12 |u|^2|v|^2\),这是右边的几何含义。
考虑到点积的几何意义是将一个向量 \(u\) 投影到另一个向量 \(v\) 上,再用投影长度乘以 \(v\) 的模长,设这两个向量的夹角为 \(\theta\), 那么点积可以表示成 \(|u||v| \cos \theta\),那么左边又可以写成 \(|u|^2|v|^2 \cos^2 \theta\)。
这时原先的不等式变成了 \(|u|^2|v|^2 \cos^2 \theta \geq \displaystyle\frac 12 |u|^2|v|^2\),消去相同的项,可以得到 \(\cos^2 \theta \geq \displaystyle\frac 12\),即 \(\cos \theta \geq \displaystyle\frac{\sqrt 2}{2}\) 或 \(\cos \theta \leq -\displaystyle\frac{\sqrt 2}{2}\),即 \(\theta \in [0, \displaystyle\frac{\pi}{4}] \cup [\frac{3 \pi}{4}, \pi]\)。
现在考虑将平面每旋转 \(\displaystyle\frac{\pi}{4}\) 划分一次,将平面划分成 \(8\) 个部分,由于有 \(11\) 个数字,根据鸽巢原理,一定有 \(2\) 个向量位于同一个部分内,那 \(\theta\) 一定满足要求,原命题证明成立。
练习四
证明由任意 \(n^2 + 1\) 个互不相同的实数构成的序列 \(a_1, a_2, \dots, a_{n^2 + 1}\),要么含有长度为 \(n + 1\) 的递增子序列,要么含有长度为 \(n + 1\) 的递减子序列。
证明:先假设原序列不存在长度为 \(n + 1\) 的递增子序列,来证明原序列存在长度为 \(n + 1\) 的递减子序列。
设 \(m_k\) 表示从 \(a_k\) 开始的最长递增子序列的长度,那么根据假设,\(\forall k \in [1, n^2 + 1], m_k \leq n\),又因为 \(m_k \geq 1\),所以 \(m_1, m_2, \dots, m_{n^2 + 1}\) 为 \(1\) 到 \(n\) 之间的整数,根据鸽巢原理,这 \(n^2 + 1\) 个数中必然有 \(n + 1\) 个是相同的数。
假设相同的 \(m\) 分别是 \(m_{k_1} = m_{k_2} = \dots = m_{k_{n + 1}}\),其中 \(1 \leq k_1 < k_2 < \dots < k_{n + 1} \leq n^2 + 1\),再假设 \(\exists i \in [1, n], a_{k_i} < a_{k_{i + 1}}\),由于 \(k_i < k_{i + 1}\),那么可以在 \(a_{k_{i + 1}}\) 的最长递增子序列前面加上 \(a_{k_i}\) 使得 \(m_{k_i} > m_{k_{i + 1}}\),这与假设矛盾,因此不存在 \(a_{k_i} < a_{k_{i + 1}}\),于是 \(a_{k_1} > a_{k_2} > \dots > a_{k_{n + 1}}\),此时这是一个长度为 \(n + 1\) 的递减子序列,原命题证明成立。
容斥原理
其实这个东西我们在小学时就学过了,比如题目,其实这就是容斥原理。一般,如果我们要不重不漏地统计至少具有一种特性的某些物品的系数,就需要考虑如何减掉重复的,如何加上漏掉的,这时就需要用容斥原理来统计。用计算式来表达就是:
\(|\displaystyle\bigcup_{i = 1}^n A_i| = \sum_{j = 1}^n (-1)^{j - 1} \sum_{1 \leq k_1 < k_2 < k_3 < \dots < k_j \leq n} |\bigcap_{l = 1}^j A_{k_l}|\)
用人话说就是如果你想求出一些集合的并集的大小,你只需要加上这些集合的大小,减掉任意两个集合的交集,加上任意 \(3\) 个集合的交集,重复这种奇数个集合就加,偶数个集合就减的方式,就可以得到,下面来证明为什么。
定理2.1
设 \(P_1, P_2, \dots, P_m\) 为研究对象的 \(m\) 种性质,\(A_m\) 为具有 \(P_m\) 性质的对象所构成的集合,\(A_i \bigcap A_j \bigcap A_k\) 表示同时具有 \(P_i, P_j, P_k\) 性质的对象所具有的,\(\overline{A_1} \bigcap \overline{A_j} \bigcap \dots \bigcap \overline{A_m}\),表示不具有任何性质的对象所构成的集合。
那么不具有性质 \(P_1, P_2, \dots, P_m\) 的对象个数由下面的交错表达式给出 \(|\overline{A_i} \bigcap \overline{A_j} \bigcap \dots \bigcap \overline{A_m}| = |S| - \displaystyle\sum|A_i| + \sum|A_i \bigcap A_j| - \sum|A_i \bigcap A_j \bigcap A_k| + \dots + (-1)^m|\sum A_i \bigcap A_j \bigcap \dots \bigcap A_m|\)。
证明:先考虑只有两个性质的情况,那么 \(|\overline{A_1} \bigcap \overline{A_2}| = |S| - |A_1| - |A_2| + |A_1 \bigcap A_2|\),现在我们只需要证明,一个既不具有 \(P_1\) 性质,也不具有 \(P_2\) 性质的元素对于右边式子的贡献为 \(1\),而具有 \(P_1\) 或 \(P_2\) 性质的元素对于右边式子的贡献为 \(0\)。
假设元素 \(x\) 既不具有 \(P_1\) 性质,也不具有 \(P_2\) 性质,那么它只被包含在 \(S\) 中,对于右边式子的贡献为 \(1 - 0 - 0 + 0 = 1\)。
假设元素 \(x\) 只具有 \(P_1\) 性质,那么它被包含在 \(S, A_1\) 中,对于右边式子的贡献为 \(1 - 1 - 0 + 0 = 0\)。
假设元素 \(x\) 只具有 \(P_2\) 性质,那么它被包含在 \(S, A_2\) 中,对于右边式子的贡献为 \(1 - 0 - 1 + 0 = 0\)。
假设元素 \(x\) 既具有 \(P_1\) 性质,也具有 \(P_2\) 性质,那么它被包含在 \(S, A_1, A_2, A_1 \bigcap A_2\) 中,对于右边式子的贡献为 \(1 - 1 - 1 + 1 = 0\)。
那么右边等式计算出的结果就是既不具有性质 \(P_1\),也不具有性质 \(P_2\) 的元素的个数。
现在考虑拓展到一般,假设元素 \(x\) 不具有任意一个性质,那么他对右边的贡献就是 \(1 - 0 + 0 - 0 + \dots + (-1)^m0 = 1\)。
考虑一个具有 \(n(n \leq m)\) 个性质的元素 \(y\),我们可以从这 \(n\) 个性质中任意选出 \(k\) 个来,那么 \(A_1 \bigcap A_2 \bigcap \dots \bigcap A_k\) 这个集合中,而一共有 \(\displaystyle\binom{n}{k}\) 个包含 \(y\) 且大小为 \(k\) 的集合你,那么答案就是 \(\displaystyle\sum_{k = 1}^m (-1)^k \binom{n}{k} = \sum_{k = 0}^n (-1)^k \binom{n}{k}\),套用二项式定理,这个式子 \(= [1 + (-1)]^n = 0\),于是 \(y\) 对右边式子的贡献为 \(0\)。
现在,只有不具有任何性质的元素对等式右边有贡献,定理 2.1 证明成立。
感性理解就是减多了就加,加多了就减。
定理2.2(容斥原理)
\(|A_1 \bigcup A_2 \bigcup \dots \bigcup A_m| = \displaystyle\sum|A_i| - \sum|A_i \bigcap A_j| + \sum|A_i \bigcap A_j \bigcap A_k| - \dots - (-1)^{m + 1}|\sum A_i \bigcap A_j \bigcap \dots \bigcap A_m|\)
证明:将定理1.1两边同时用 \(|S|\) 减即可证明。
容斥系数
例题三
如何现在有一个序列 \(a_n\),\(0 \leq a_n \leq m\),请问有多少个序列满足:不存在两个连续的0?
例题四
问对于所有长为 \(n\) 的排列,有多少排列存在一个连续上升段 \(\geq k\)。对所有 \(k\) 回答,对大质数取模。
反射容斥
反演
广义的反演,就是两个函数之间互相推倒的关系,比如 \(f(x) = xg(x)\),那么 \(g(x) = \displaystyle\frac{f(x)}{x}\),放到离散意义下,就可以表示两个数列之间之间互相推倒的关系,比如 \(F(n) = \displaystyle\sum_{i = 1}^n G(i)\)(前缀和),那么 \(G(n) = F(n) - F(n - 1)\)(差分),这就是信息学中常见的反演。
考虑如果将第二个式子带入第一个式子,那么会得到 \(F(n) = F(n)\) 这样一个无聊的等式,相当于是什么也没有做,这和线性代数中的线性变换与逆变换极其类似,这也可以从矩阵的角度分析,假设 \(F(n) = AG(n)\),那么一定有 \(G(n) = A^{-1}F(n)\),若有多个反演叠加,将它们的转移矩阵全部乘在一起就行了。
信息学竞赛中常见的反演有以下几种:
-
二项式反演:与容斥原理有关,一般解决“恰好”与“至多(少)”、“给定”与“任意”之间的转换关系;
-
Min-Max 反演:与容斥原理有关,将 \(\min\) 用 \(\max\) 表示,或将 \(\max\) 用 \(\min\) 表示,在某些题中可以改变枚举顺序或枚举类型;
-
单位根反演:与多项式有关,\(DFT\) 对单位根多点求值后,用单位根反演重新插值出原函数;
-
莫比乌斯反演:与数论有关,一般用于含有 \(\gcd\) 的式子的简化;
-
斯特林反演:与组合数学有关,由于第二类斯特林数是好求的,运用斯特林反演之后可以计算出第一类斯特林数,在上升幂、普通幂、下降幂之间的转化有用处。
-
子集反演:与高维前缀和有关系,一般结合快速莫比乌斯变换或快速沃尔什变换可以处理高位空间中特殊的数点问题;
二项式反演
先来看一下最基本的式子:
这个式子有一个等价形式,就是
这个式子可以说是非常的对称,根据反演可以看作矩阵乘法,那么该矩阵 \(A \times A = I\)。
我们可以先从线性代数的角度来证明一下。
证:
或者可以最暴力地带入证明
证:\(F(n) = \displaystyle\sum_{i = m}^n \binom ni \sum_{j = m}^i (-1)^{i - j} \binom ij F(j)\)
考虑改变求和顺序,那么原式
\(= \displaystyle\sum_{j = m}^n F(j) \displaystyle\sum_{i = j}^n \binom ni \binom ij (-1)^{i - j}\)
套用三项式系数恒等式,那么原式
\(= \displaystyle\sum_{j = m}^n F(j) \displaystyle\sum_{i = j}^n \binom nj \binom{n - j}{i - j} (-1)^{i - j}\)
再次调整计算顺序,那么原式
\(= \displaystyle\sum_{j = m}^n \binom nj F(j) \displaystyle\sum_{i = j}^n \binom{n - j}{i - j} (-1)^{i - j}\)
将枚举 \(i\) 替换为枚举 \(i - j\),那么原式
\(= \displaystyle\sum_{j = m}^n \binom nj F(j) \sum_{i = 0}^{n - j} \binom{n - j}{i} (-1)^i\)
发现内层求和是一个二项式定理的形式,可以写成 \([1 + (-1)]^{n - j}\) 形式,而这个式子只有在 \(n - j = 0\) 时才有值 \(1\),于是原式最终写成
\(\displaystyle\sum_{j = m}^n \binom nj F(j) [n = j] = F(n)\)
第二种形式证明类似。
练习(洛谷什么时候把这道题传上去的)
有 \(n\) 个元素,问有多少种选择若干个子集的方案,使得选出的子集的交集大小恰好为 \(k\)。
\(0<k\leq n\leq10^6\)
解:直接钦定 \(i\) 个的方案数是 \(F(i)=\dbinom ni(2^{2^{n-i}}-1)\),设答案为 \(G(i)\),观察到
那么反演即可得到:
\(G(k)=\sum\limits_{i=k}^n\dbinom ik F(i)\)
\(=\sum\limits_{i=k}^n(-1)^{i - k}\dbinom ik \dbinom ni (2^{2^{n-i}}-1)\)
这样之后直接做就行了。
一句话题意:有两个序列 \({a_i},{b_i}\) 保证所有元素互不相同。你需要重排 \(b\) 序列,使得恰好有 \(k\) 个 \(i\) 满足 \(a_i>b_i\)。
\(0<k\leq n\leq2000\)
解:先将 \(a\) 序列排序。
考虑设 \(dp_{i,j}\) 表示考虑了前 \(i\) 对数,恰有 \(j\) 对 \(a_x>b_x\),发现完全没法转移(
主要是你配大的和配小的总有一个转不了,所以你考虑只算其中一个,也就是钦定有 \(j\) 对数满足 \(a_x>b_x\),发现这样就可以转了。
\(cnt(a_i)\) 表示 \(b\) 序列中比 \(a_i\) 小的数的个数。
然后设 \(f(i)\) 表示钦定了 \(i\) 对的方案数,\(g(i)\) 表示恰好 \(i\) 对的方案数。观察可得:
\((n-i)!dp_{n,i}=f(i)=\sum\limits_{j=i}^n\dbinom ji g(j)\)
\(g(k)=\sum\limits_{i=k} ^n{(-1)^{i-k}\dbinom ik(n-i)!dp_{n,i}}\)
就可以直接做了。
一句话题意:有一个 \(n\times n\) 的矩阵,将其三染色,使得至少有一行或者一列同色,问方案数。
\(n\leq10^6\)
解:直接钦定 \(i\) 行 \(j\) 列同色:
\(F(i,0)=3^{(n-i)n+i}\dbinom ni\)
\(F(0,j)=3^{(n-j)n+j}\dbinom nj\)
\(F(i,j)=3^{(n-i)(n-j)+1}\dbinom ni\dbinom nj\)
考虑恰好 \(i\) 行 \(j\) 列同色:
\(G(0,0)=3^{n^2}+\sum\limits_{i=1}^n(-1)^{n-i}\dbinom ni(F(0,i)+F(i,0))+\sum\limits_{i=1}^n\sum\limits_{j=1}^n(-1)^{2n-i-j}\dbinom i0\dbinom j0 F(i,j)\)
后面那坨东西带进去:
\(\sum\limits_{i=1}^n\sum\limits_{j=1}^n3^{n^2-ni-nj+ij+1}(-1)^{2n-i-j}\dbinom ni\dbinom nj\)
\(=3^{n^2+1}\sum\limits_{i=1}^n{3^{-ni}(-1)^{n-i}\dbinom ni\sum\limits_{j=1}^n{(3^{n-i})^{j}(-1)^{n-j}\dbinom nj}}\)
\(=3^{n^2+1}\sum\limits_{i=1}^{n}{3^{-ni}(-1)^{n-i}((3^{n-i}-1)^n-(-1)^n)}\)
然后就做完了。
min / max反演(容斥)
\(min/max\) 反过来也成立。
证:\(\max\limits_{k_{th}}{S}=\sum\limits_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}\min T}\)
\(=\sum\limits_{x\in S}x\sum\limits_{x\in T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}[\min{T}=x]}\)
令 \(f(x)\) 表示 \(S\) 中大于 \(x\) 的元素构成的集合。
\(=\sum\limits_{x\in S}{x}\sum\limits_{x\in T\subseteq f(x)}{(-1)^{|T|-k}\dbinom{|T|-1}{k-1}}\)
枚举 \(|T|\):
\(=\sum\limits_{x\in S}{x\sum\limits_{l = 1}^{|f(x)|}{(-1)^{l-k}\dbinom{|f(x)|-1}{l-1}\dbinom{l-1}{k-1}}}\)
\(=\sum\limits_{x\in S}{x\sum\limits_{l=1}^{|f(x)|}{(-1)^{l-k}\dbinom {|f(x)|-1}{k-1}\dbinom{|f(x)|-k}{l-k}}}\)
\(=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}\sum\limits_{l=1} ^{|f(x)|}{(-1)^{l-k}\dbinom {|f(x)|-k}{l-k}}}\)
易知 \(|f(x)|< k\) 时无贡献。
\(=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}\sum\limits_{l=0}^{|f(x)|-k}(-1)^l\dbinom{|f(x)|-k}{l}}\)
\(=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}[|f(x)|=k]}\)
\(=\max\limits_{k_{th}}{S}\)
练习
给定三个序列 \(a_i,b_i,c_i\),求
\(n\leq2\times10^5\)
解:暴力拆开那个 \(max\) :
\(\max{a_i+a_j,b_i+b_j,c_i+c_j}\)
\(=\min{a_i+a_j}+\min{b_i+b_j}+\min{c_i+c_j}-\min{a_i+a_j,b_i+b_j}\\-\min{a_i+a_j,c_i+c_j}-\min{b_i+b_j,c_i+c_j}+\\\min{a_i+a_j,b_i+b_j,c_i+c_j}\)
抵消掉最后那一项,剩下的项中,只有一个的是平凡的,有两个的可以二维偏序,总复杂度就是 \(O(n\log{n})\)。
一句话题意:给 \(n\) 个元素,每次会随机选择一个,有 \(p_i\) 的概率选择第 \(i\) 个,问第一次所有元素都被选择过的期望时间。
\(1\leq n\leq20\)
解:因为 \(min/max\) 容斥都是线性运算,且期望具有线性性,所以可以直接套上期望:
\(E(\max{S})=\sum\limits_{T\subseteq S}{(-1) ^{|T|-1}E(\min{T})}\)
\(E(\min{T})\) 的含义实际上就是第一次选到 \(T\) 中元素的期望时间,可以把 \(T\) 和 \(T\) 的补集看做两个整体,那么一次选中的概率就是 \(\frac 1{\sum\limits_{x\in T}{p_x}}\),期望时间就是其倒数 \(\sum\limits_{x\in T}{p_x}\)
然后直接带进式子里计算即可,\(O(n2^n)\)。
一句话题意:给 \(n\) 个元素,每次会随机选择一个,有 \(\frac M {p_i}\) 的概率选择第 \(i\) 个,问第一次有 \(k\) 元素被选择过的期望时间。
\(1\leq l\leq n\leq 10^3,n-10\leq k\leq n,\sum\limits_{i=1}^n{p_i}=M\leq10^4\)。
解:相当于求期望出现时间第 \(n-k\) 大,令 \(k\leftarrow n-k\),一样的期望式子列出来:
\(E(\max\limits_{k_{th}}S)=\sum\limits_{T\subseteq S}{(-1)^{|T|-1}\dbinom {|T|-1}{k-1}\frac{m}{\sum\limits_{x\in T}p_x}}\)
直接求肯定 G。因为 \(M\leq10^4\),所以考虑计算每一种 \(\sum\limits_{x\in T}{p_x}\) 作为分母的项的系数之和,再算答案。
考虑设 \(dp_{i,j}\) 表示前 \(i\) 个,分母和为 \(j\) 的项的系数和。
不选很好转移,选的话中间那坨组合数就不太能转的动。
考虑到 \(\dbinom {|T|-1}{k-1}=\frac{|T|-1}{|T|-k}\dbinom{|T|-2}{k-1}\),所以我们可以在方程里及一个 \(l=|T|\),那就可以转了:
\(dp_{i,j,l}=dp_{i-1,j,l}-\frac{l-1}{l-k}dp_{i-1,j-p_i,l-1}\)
但是这个方程是 \(O(n^2m)\) 的,显然过不了,且没用到 \(k\leq10\) 的性质。
又考虑到 \(\dbinom {|T|-1}{k-1}=\dbinom{|T|-2}{k-1}+\dbinom{|T|-2}{k-2}\)
那么只需要在方程中记 \(l=k\) 即可转移:
\(dp_{i,j,l}=dp_{i-1,j,l}+dp_{i-1,j-p_i,l-1}-dp_{i-1,j-p_i,l}\)
就可以 \(O(nmk)\) 了。
子集反演
快速沃尔什变换(FWT)
快速莫比乌斯变换(FMT)
参考资料
-
Introductory Combinatorics(Fifth Edition) Richard A.Brualdi
-
Discrete Mathematics and Its Applications(Eighth Edition) Kenneth H.Rosen
-
炫酷反演魔术 command_block
本文来自博客园,作者:Orange_new,转载请注明原文链接:https://www.cnblogs.com/JPGOJCZX/p/18336945

浙公网安备 33010602011771号