组合数学(待更新)
严格弱序(Strict Weak Ordering)
序理论相关可以看oiwiki序理论。
严格弱序是一种二元关系(以下为简便称之为\(<\),定义在集合\(S\)上),满足以下性质:
(不可比关系(\(x\) is incomparable with \(y\))可表达为\(\neg(x<y\lor y<x)\),这里为方便简记为\(p(x,y)\))
-
(非自反性irreflexivity)\(\forall x\in S,x \not< x\)
-
(非对称性asymmetry)\(\forall x,y\in S,x<y\Rightarrow y\not< x\)
-
(传递性transitivity)\(\forall x,y,z\in S,x<y\land y<z\Rightarrow x<z\)
-
(不可比的传递性transitivity of incomparability)\(\forall x,y,z\in S,p(x,y)\land p(y,z)\Rightarrow p(x,z)\)
注意到满足严格弱序的运算符能够表示所有逻辑运算符,以小于号\(<\)为例:
-
\(a<b\)
-
\(a>b\iff b<a\)
-
\(a=b\iff \neg(a<b\lor b<a)\)
-
\(a\le b\iff \neg(b<a)\)
-
\(a\ge b\iff \neg(a<b)\)
-
\(a\ne b\iff a<b\lor b<a\)
但不满足严格弱序的运算符(如\(\le\))就不行。这也是C++中重载后的比较规则要满足严格弱序的原因(最初默认采用的是小于号\(<\))。
Lucas定理
证:
注意到 \({p \choose n} \equiv [n=p \lor n=0] \pmod p\),
因此 \((a+b)^p \equiv a^p+b^p \pmod p\)。
对于 \(f(x)=(1+x)^n\),\([x^m]f(x)={n \choose m}\)。
我们现在对 \(f(x)\) 做一点变换,
\[\begin{aligned} f(x)&=(1+x)^n\\ &=(1+x)^{p \times \lfloor \frac{n}{p} \rfloor}(1+x)^{n \bmod p}\\ &=((1+x)^{p})^{\lfloor \frac{n}{p} \rfloor}(1+x)^{n \bmod p} \end{aligned} \]所以 \(f(x) \equiv (1+x^p)^{\lfloor \frac{n}{p} \rfloor} (1+x)^{n \bmod p} \pmod p\)
设 \(h(x)=(1+x^p)^{\lfloor \frac{n}{p} \rfloor},g(x)=(1+x)^{n \bmod p}\),
则 \([x^m]f(x) \equiv [x^{kp}]h(x) \times [x^r]g(x) \pmod p\)。
因为 \(0 \le r < p\),所以将 \(m\) 拆成 \(m=kp+r\) 的形式的方法是唯一的,即 \(k=\lfloor \frac{m}{p} \rfloor,r=m \bmod p\)。
所以 \([x^{kp}]h(x)={\lfloor \frac{n}{p} \rfloor \choose \lfloor \frac{m}{p} \rfloor},[x^r]g(x)={n \bmod p \choose m \bmod p}\)。
原式得证。
感觉不是很严谨,感性理解一下。
错排
记 \(f_n\) 表示长度为 \(n\) 且不存在 \(p_i=i\) 的排列的个数。
证明:
考虑将 \(1\) 放在位置 \(k\) 上(\(k \ne 1\)),这里有 \(n-1\) 种方法,\(k\) 的放置位置可分类讨论。
\(k\) 放在位置 \(1\) 上,那么还要将剩下 \(n-2\) 个数错排,即 \(f_{n-2}\)。
\(k\) 放在位置 \(t\) 上,那么此时的错排中位置 \(1\) 上放的数 \(p\) 一定有 \(p \ne 1 \land p \ne k\),所以可以构造另一个排列:将 \(p\) 放在位置 \(k\) 上,并将 \(1\) 与位置 \(1\) 去掉。显然新的排列是一个长度为 \(n-1\) 的错排,且与原来的错排是 一一对应 的。即 \(f_{n-1}\)。
综上,原式得证。
注意,本证明过程在某些题中也可以用来推导递推关系(如P7438 更简单的排列计数)。
鸽巢原理
将 \((\sum\limits_{i=1}^n{p_i})-n+1\) 放入 \(n\) 个盒子,一定存在一个盒子 \(i\),使得第 \(i\) 个盒子至少装了 \(p_i\) 个物品。
证:
设第 \(i\) 个盒子装了 \(a_i\) 个物品,假设:
\(\forall x \in \mathbb{N^* } \land 1\le x \le n,a_i < p_i\),则有 \(\sum a_i \le (\sum p_i)-n <(\sum p_i)-n+1\),矛盾。
所以原命题得证。
练习
- 有十个数 \(a_1,a_2\dots a_{10}\) 满足 \(\forall_{1\leq i\leq10}{1\leq a_i\leq60}\),证明能够从 \(a_i\) 中挑出两个交为空的子集,使得它们的和相等。
证:
注意到两个交不为空且和相等的子集减去交集后和仍然相等,所以“交为空”的限制可以去掉。总共有 \(2^{10}=1024\) 个子集,而和的取值范围为 \([0,600]\),根据鸽巢原理,原命题得证。
- 证明一张有超过 1 个点的简单无向图必定有两点度数相等。
证:
若有 \(2\) 个度为 \(0\) 的点,已有两点度数相等。
若有 \(1\) 个度为 \(0\) 的点,则其他 \(n-1\)个点的度数的取值范围为 \([1,n-2]\),根据鸽巢原理,一定有两点度数相等。
若没有度数为 \(0\) 的点,则 \(n\) 个点的度数的取值范围为 \([1,n-1]\),根据鸽巢原理,一定有两点度数相等。
综上,原命题得证。
3.证明能从任意 \(11\) 个实数中挑选出 \(4\) 个数 \(a,b,c,d\) 满足:
证:
\[\frac{(ac+bd)^2}{(a^2+b^2)(c^2+d^2)} \ge \frac{1}{2}\\ 令 \overrightarrow{x}=(a,b),\overrightarrow{y}=(c,d)\\ \cos^2<\overrightarrow{x},\overrightarrow{y}> \ge \frac{1}{2}\\ 即转化成 \overrightarrow{x} 和 \overrightarrow{y}的夹角不大于 \frac{\pi}{4} \]由于 \(11\) 个实数中根据鸽巢原理,至少有 \(6\) 个数符号相同,所以可以挑出三个同一象限的向量,其中一定有两个向量的夹角不大于 \(\frac{\pi}{4}\)。
容斥原理
练习一
有 \(n\) 个元素,问有多少种选择若干个子集的方案,使得选出的子集的交集大小恰好为 \(k\)。
解:
设钦定交集大小为 \(k\) 的方案数为 \(g(k)\),交集大小恰好为 \(k\) 的方案数为 \(f(k)\)。有:
解释以下第一个式子,钦定 \(k\) 个后还有 \(2^{n-k}\) 个子集,每个集合选或不选,即 \(2^{2^{n-k}}\) 种方案,最后要减去一个集合都不选的 \(1\) 种方案。
然后反演即可。
练习二
有两个序列 \({a_i},{b_i}\) 保证所有元素互不相同。你需要重排 \(b\) 序列,使得恰好有 \(k\) 个 \(i\) 满足 \(a_i>b_i\),求方案数。
\(0<k\leq n\leq2000\)
解:
注意到序列 \(a\) 的顺序对答案是没有影响的,所以先将 \(a\) 从小到大排序。
设 \(dp_{i,j}\) 表示考虑了前 \(i\) 对,有 \(j\) 对满足限制的。
发现转移不了(填当前位置上的 \(b\) 时不知道前面不满足限制的 \(b\) 与当前位置上的 \(a\) 的关系)。
考虑只算 \(a>b\) 的,即修改定义为考虑了前 \(i\) 对,钦定了 \(j\) 对满足限制的方案数,发现可以转移了。
\(cnt_{a_i}\) 表示序列 \(b\) 中比 \(a_i\) 小的数的个数。
由于序列 \(a\) 单调递增,所以前面 \(j-1\) 个 \(b\) 都比 \(a_i\) 小,在算的时候要减去。
设 \(g(k)\) 表示钦定 \(k\) 对满足限制的方案数,\(f(k)\) 表示恰好 \(k\) 对满足限制的方案数。有:
于是反演即可。
练习三
有一个 \(n\times n\) 的矩阵,将其三染色,使得至少有一行或者一列同色,问方案数。
\(n\leq10^6\)
解:
设 \(g(i,j)\) 表示钦定有 \(i\) 行 \(j\) 列同色的方案数,\(f(i,j)\) 表示恰好有 \(i\) 行 \(j\) 列同色的方案数。
我们发现,当 \(i>0 \land j>0\) 时,这些同色的行和列一定是同一种颜色。故有下式:
找 \(g(i,j)\) 和 \(f(i,j)\) 的关系:
对此反演,有两种方法。
练三法一
我们设:
故
对上面两个式子反演得到:
所以得到:
现在来考虑我们要求到什么。
求至少有 \(1\) 行或 \(1\) 列同色的方案数,即用总方案数减去恰好有 \(0\) 行 \(0\) 列同色的方案数,所以我们要求的是 \(f(0,0)\)。
由于我们对 \(g\) 的取值进行了分讨,这里将式子按分讨拆开。
后面三块式子已经可以 \(O(n)\) 做了,来看前面两重求和号的式子。
这样子就做完了。
练三法二
对于我们要反演的式子:
有二元二项式反演:
证明同法一。
可以推广到 \(n\) 元的形式。
练习四
记 \({n\brace m}\) 表示把 \(n\) 个不同的物品划分为 \(m\) 个集合构成簇的方案数(不允许空集),求 \({n \brace m}\)。
解:
显然有 \(O(nm)\) 的递推:
另一种更快的做法:
设 \(f(m)\) 表示恰好把 \(n\) 个不同的物品划分为 \(m\) 个互不相同的集合构成簇的方案数(集合不能为空),\(g(m)\) 表示把 \(n\) 个不同的物品放入钦定的 \(m\) 个互不相同的集合构成簇的方案数,其中集合可以为空。
所以 \(g(m)= m^n= \sum \limits_{i=0}^m {m \choose i} f(i)\)。
反演一下得到:
由于原来的集合都是相同的,所以 \({n \brace m}=\frac{f(m)}{m!}\)。
即:
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}\)
原式得证。
证明 \(\min\) 的方法类似。将 \(k=1\) 代入得到另外两个式子。
练习一
给定三个序列 \(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\) 的补集看做两个整体,那么一次选中的概率就是 \(\sum\limits_{x\in T}{p_x}\),期望时间就是其倒数 \(\frac 1{\sum\limits_{x\in T}{p_x}}\)
然后直接带进式子里计算即可,\(O(n2^n)\)
练习三
给 \(n\) 个元素,每次会随机选择一个,有 \(\frac {p_i} M\) 的概率选择第 \(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+1\) 大,令 \(k \leftarrow n-k+1\),一样的期望式子列出来:
\(E(\max\limits_{k_{th}}S)=\sum\limits_{T\subseteq S}{(-1)^{|T|-k}\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}\)
(解释:如果第 \(i\) 个不选,即有 \(dp_{i-1,j,l}\) 的贡献,如果第 \(i\) 个要选,即 \(|T| \leftarrow |T|+1\),观察把组合数拆开之后的式子,\((-1)^{|T|-k}\) 的符号会改变,所以拆开后的 \({|T|-2 \choose k-1}\) 这一项的符号改变,贡献为 \(-dp_{i-1,j-p_i,l}\)。而对于 \({|T|-2 \choose k-2}\) 这一项,\(k\) 的值也变化了 \(1\),对于 \((-1)^{|T|-k}\) 的影响还有一个 \(-1\),所以符号不变,贡献为 \(+dp_{i-1,j-p_i,l-1}\))
就可以 \(O(nmk)\) 了。
康托展开
\(Question\):求\(1\)到\(n\)的一个排列的排名。
式子:
其中\(sum_{a_i}\)指下标大于\(i\)的数中比\(a_i\)大的数的个数。可以用树状数组来维护这个东西。
理解一下,有些类似数位DP,前\(i-1\)位视作固定了,那么只有\(sum_{a_i}\)个数放在第\(i\)位时比当前的排列排名小。
确定好第\(i\)位后,后面\(n-i\)位就随便放,所以式子长这样。
注意一下这里的排名从\(0\)开始。
置换和排列
都要退役了还没系统地学这个东西,只是零零散散会一点。
定义
一个集合 \(X\) 到自身的双射 \(\sigma\) 称为一个置换。若 \(X\) 上有全序,那么一个置换液被称为一个(全)排列。该全序也被称为自然顺序。
大小为 \(n\) 的集合有 \(n!\) 种置换。
表示方法
双行记号
没啥用。写成 \(\sigma=\begin{pmatrix}1 & 2 & 3\\ 2 & 3 & 1 \end{pmatrix}\),表示第一行置换后得到第二行。
单行记号
将双行记号中的第一行按自然顺序写,记 \(\sigma(i)\) 为第一行中的数 \(i\) 对应的第二行的数,比如写下 \(\sigma(1)\sigma(2)\sigma(3)=231\)。
这个可以用来比排列的大小。
轮换表示
极其重要。
随便写下 \(X\) 中的一个还未被写下的数 \(x\),然后重复写下 $\sigma(x),\sigma(\sigma(x))\cdots $,直到一个数已经被写下过就停止,将刚才写下的东西用括号括起来,回到第一步。
就是常说的拆置换环。连有向边 \(x\to \sigma(x)\)。由于 \(\sigma\) 是双射,\(x\) 的入度和出度都是 \(1\),所以会构成若干个环。
比如排列 \(265431\),写出轮换表示为 \((126)(35)(4)\)。实践中有时会省略长度为 \(1\) 的轮换。恒等置换常记作 \((1)\)。
一些题推性质也是这样建图去找。
复合
也叫置换的乘积。
比如 \(\sigma=\begin{pmatrix}x_1&x_2&\cdots &x_n\\ x_{p_1}&x_{p_2}&\cdots & x_{p_n}\end{pmatrix}\),\(\pi=\begin{pmatrix}x_{p_1}&x_{p_2}&\cdots & x_{p_n}\\ x_{q_1}&x_{q_2}&\cdots & x_{q_n}\end{pmatrix}\)
那么 \(\pi\circ\sigma=\begin{pmatrix}x_1&x_2&\cdots &x_n\\ x_{q_1}&x_{q_2}&\cdots & x_{q_n}\end{pmatrix}\),类似函数复合,\((\pi\circ\sigma)(x)=\pi(\sigma(x))\)。
这个东西有结合律,没有交换律,所以注意顺序。
一个置换的幂可以用快速幂 \(O(n\log n)\) 计算,也可以拆置换环后,将复合原来的置换看作在置换环上走一步,只需要取模一下 \(O(n)\) 计算。

浙公网安备 33010602011771号