组合数学
组合数学
一些必要 trick
- 推式子,先提 \(\sum\) 和 \(\Pi\) 到最前面,然后从后往前合并,必要时考虑更改 \(\sum\) 的取值
- 看到次方变为斯特林数,\(x^n=\sum\limits_{i=0}^{n} {n \brace i}{x \choose i}i!=\sum\limits_{i=0}^{n}\sum\limits_{i=1}^m{(-1)^{m-i}\frac{i^n}{(m-i)!}}{x \choose i}\)
- 注意莫反、欧反的形式
推式子基本原理
- 先把 \(\sum\) 移到最前面。
- 将多个 \(\sum\) 排序,范围更小的放在前面。
- 将只与当前 \(\sum\) 有关的式子尽量往前提。
- 将能简化式子的特殊边界提出来。
- 从后往前处理。
基本概念
- \(a^{\underline m}\) 表示 \(a\) 的 \(m\) 次下降幂。
- \(a^{\overline m}\) 表示 \(a\) 的 \(m\) 次上升幂。
递推式
证明
从组合意义上推导,在 n 个人中选 m 个相当于单独考虑最后一人,若他要选,则为\({n-1 \choose m-1}\)他不选则为 \({n-1 \choose m}\)。
吸引/相伴等式
另外的形式:
上指标反转
证明
三项式系数恒等式
等式两边拆开约分即可得证。
平行求和
证明
将\({n+m+1 \choose m}\)用加法公式展开即可。
上指标求和
证明
从组合意义入手,相当于我从 \(n+1\) 个数中选 \(m+1\) 个数,先假设选 \(i\),那么 \(i\) 前面还需要选 \(m\) 个数,枚举这个 \(i\),即为答案。
也可通过微积分求导知识进行证明,这里不再详述。
练习一:
求 \(\sum\limits_{i=0}^{m}{n+i \choose i}\)
解
下指标求和(整行)
证明
交错求和
证明
下指标卷积(范德蒙德卷积)
证明
从 \(n\) 个数中选 \(i\) 个数,再从 \(m\) 个数中选 \(k-i\) 个数,相当于从 \(n+m\) 个数中选 \(k\) 个数。
练习二:
求 \(\sum\limits_{i=0}^{m}{n \choose i}{m \choose i}\)
解
上指标卷积
证明
相当于从左边 \(i\) 个中选 \(a\) 个,右边 \(n-i\) 个中选 \(b\) 个。等于从 \(n\) 个中选 \(a+b\) 个,枚举分割点 \(i\)。
练习三:
求 \(\sum\limits_{i=m}^{n}(-1)^i{n \choose i}{i \choose m}\)
解
至此,组合数学的基本内容已结束。
总结如下图:
Lucas定理
其中 \(p\) 为质数。
证明
注意到 \({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,f(x)[x^m]={n \choose m}\)。
我们现在对 \(f(x)\) 做一点变换,
所以对于 \(f(x)\),前半部分 \(((1+x)^p)^{\lfloor\frac{n}{p}\rfloor}\) 一定为 \(p\) 的倍数,后半部分 \((1+x)^{n \bmod p}\) 一定小于 \(p\) ,设 \(h(x)=(1+x^p)^{\lfloor\frac{n}{p}\rfloor}\) , \(g(x)=(1+x)^{n \bmod p}\)。
\(f(x)[x^m]=h(x)[x^{kp}]\times g(x)[x^{r}] \pmod p\)
所以就有 \(m=kp+r\rightarrow k=\lfloor \frac{m}{k}\rfloor,r=m\bmod p\)。
就可以得出:
二项式定理
拓展——下降(上升)幂二项式定理
证明(这里不用数学归纳法进行证明)
上升幂方法相同。
错排
定义:一个满足 \(a_i\ne i\) 的序列。
推导式:
证明
若当前将 \(1\) 放到位置 \(k(k\ne 1)\),那么 \(k\) 的放置位置可以分类讨论:
-
\(k\) 放在位置 \(1\) 上,那么还会剩下 \(n-2\) 个数错排,方案数为 \(f_{n-2}\)。
-
\(k\) 放到某个位置 \(t(t\ne 1)\),那么假设 \(1\) 号位置填上了 \(P\),则 \(p\ne 1 \land p\ne k\),此时可以考虑一个新序列,把 \(1\) 去掉,此时方案数为 \(f_{n-1}\)
设 \(\text{cyc}_\pi\) 将长为 \(n\) 的排列 \(\pi\) 当成置换时所能分解成的循环个数。给定两个整数 \(n,k\) 和一个 \(k-1\) 次多项式,对 \(1\leq m\leq n\) 求:
其中 \(\pi\) 是长度为 \(m\) 且不存在位置 \(i\) 使得 \(\pi_i=i\) 的排列。
解
我们发现,\(\sum\limits_{i=j}^{k-1}f_i {i \brace j}\) 与 \(\sum\limits_\pi{cyc_\pi \choose j}\) 无关,所以可以将其预处理。
\(j!,f_i,{i \brace j}\) 都是能够优先处理的。现在考虑 \({cyc_\pi \choose j}\) 的处理。
定义函数 \(C_{t,j}\) 为长度为 \(t\) ,环数为 \(j\) 的排列数,\(P_{t,j}=\sum\limits_{{|\pi |}=t}{cyc_\pi \choose j}\) ,通过推导,能够得出:
那么答案即为:
其中 \(i\) 的复杂度为 \(O(n)\) ,\(j\) 的复杂度为 \(O(k)\),总复杂度为 \(O(nk)\),不会超时。
鸽巢定理
原理:将 \((\sum\limits_{i=1}^{n}p_i)-n+1\) 个东西放入 \(n\) 个盒子中,一定存在一个盒子 \(i\),使得第 \(i\) 个盒子至少装了 \(p_i\) 个物品。
证明(反证法)
与条件矛盾,故成立。
练习四
有十个数 \(a_1,a_2...a_10\) 满足 \(\forall_{1\le i\le 10}1\le a_i\le 60\),证明能够从 \(a_i\) 中挑出两个交为空的子集,使得它们的和相等。
证明
两个交为空的子集和相等,所以加上交集后和仍不变,总共有 \(2^{10}=1024\),但值域仅为 \([0,600]\),故能够选出。
练习五
证明一张有超过 \(1\) 个点的简单无向图必定有两点度数相等。
证明
考虑分类讨论:
-
有 \(2\) 个度数为 \(0\) 的点,符合条件。
-
有 \(1\) 个度数为 \(0\) 的点,则第 \(n\) 个点需要连 \(n-1\) 条边,故至少有一个点符合。
-
没有度数为 \(0\) 的点,那么边数的范围为 \([1,n-1]\),所以符合。
练习六
证明能从任意 11 个实数中挑选出 4 个数 \(a,b,c,d\) 满足:
\((ac+bd)^2\geq\frac 1 2(a^2+b^2)(c^2+d^2)\)
证明
我们令 \(\overrightarrow x=(a,b),\overrightarrow y=(c,d)\)。原式变为:\(\overrightarrow x \overrightarrow y \ge \frac{\sqrt{2}}{2}\sqrt{|\overrightarrow x||\overrightarrow y|}\)。那么就有:\(\cos<\overrightarrow x,\overrightarrow y>=\frac{\overrightarrow x \overrightarrow y}{\sqrt{|\overrightarrow x||\overrightarrow y|}} \ge \frac{\sqrt{2}}{2}\)
故 \(\overrightarrow x\) 与 \(\overrightarrow y\) 的夹角为 \(45\) 度。然后我们发现,\(11\) 个实数中必定有至少 \(6\) 个正数或负数,故我们只需选择正负性相同的 \(4\) 个数字,这样两条向量一定在同一象限。因为我们有在同一象限的 \(3\) 条向量,每两条之间最大夹角小于 \(45\) 度。故得证。
容斥原理
对于一个集合 \(S\) 的一部分子集构成的簇 \(P\) 有:
基本容斥原理为高中必学内容,这里对此不过多阐述。
二项式反演
结论:
证明
\(F(n)=\sum\limits_{i=m}^n\dbinom ni\sum\limits_{j=m}^i(-1)^{i-j}\dbinom ijF(j)\)
\(=\sum\limits_{j=m}^nF(j)\sum\limits_{i=j}^n\dbinom ni\dbinom ij(-1)^{i-j}\)
\(=\sum\limits_{j=m}^nF(j)\sum\limits_{i=j}^n\dbinom nj\dbinom {n-j}{i-j}(-1)^{i-j}\)
\(=\sum\limits_{j=m}^n\dbinom nj F(j)\sum\limits_{i=j}^n\dbinom {n-j}{i-j}(-1)^{i-j}\)
\(=\sum\limits_{j=m}^n\dbinom nj F(j)\sum\limits_{i=0}^{n-j}\dbinom {n-j}{i}(-1)^{i}\)
\(=\sum\limits_{j=m}^n\dbinom nj F(j)[n=j]\)
\(=F(n)\)
第二种形式证明类似。
有 \(n\) 个元素,问有多少种选择若干个子集的方案,使得选出的子集的交集恰好为 \(k\)。
\(0 < k \le n \le 10^6\)
解
我们先考虑子集的交集大小至少为 \(i\) 的方案,记为 \(F(i)\),那么相当于先挑出 \(i\) 个,再从 \(n-i\) 个中计算出剩余元素的子集的数量即为 \(2^{n-i}\),然后我们需要在这些剩余子集中的挑选子集方案,即为 \(2^{2^{n-i}}\),考虑到当剩余子集为空时,方案就为 \(i\) ,舍去,所以可得 \(F(i)={n \choose i}(2^{2^{n-i}}-1)\)。
然后我们考虑答案函数 \(G(k)\),因为 \(F(i)\) 在求解时会对所有交集大小大于等于 \(i\) 的情况计数,理想情况下应该计数 \(1\) 次,但是经过画图可以发现,当我们处理类似 \(G(i+1)\) 的情况时,其也会对 \(F(i)\) 产生贡献,贡献为 \({i+1 \choose i}\),所以可以得出结论:
进行二项式反演可得:
现在就可以解决了。
练习八 BZOJ3622 已经没有什么好害怕的了(P4859)
有两个序列 \(a_i,b_i\) 保证所有元素互不相同。你需要重排 \(b\) 序列,使得恰好有 \(k\) 个 \(i\) 满足 \(a_i>b_i\)。,求方案数。
\(0<k\leq n\leq2000\)。
解
先将 \(a\) 序列排序,使其单调上升。
考虑 \(dp_{i,j}\) 表示考虑前 \(i\) 对数,恰有 \(j\) 对 \(a_i>b_i\) ,这样无法转移。
还是先考虑前 \(i\) 个中至少 \(j\) 对 \(a_i>b_i\),设为 \(dp_{i,j}\),那么就有
\(cnt(a_i)\) 表示在当前 \(i\) 位置,有多少个 \(b\) 满足 \(a_i>b\)。
然后设 \(F(i)\) 表示钦定 \(i\) 对符合条件的方案数,\(G(i)\) 表示恰好 \(i\) 对的方案数。在当前位置,由于钦定 \(i\) 对符合,所以剩下的数随便排序,就为 \(A_{n-i}^{n-i}=(n-1)!\),就有:
反演可得:
然后就能够解决啦。
有一个 \(n\times n\) 的矩阵,将其三染色,使得至少有一行或者一列同色,问方案数。
\(n\leq10^6\)
解
我们先钦定有 \(i\) 行 \(j\) 列同色,记为 \(F(i,j)\)
考虑恰好有 \(i\) 行 \(j\) 列同色,记为 \(G(i,j)\)
我们需要求至少一行一列,所以可以用 \(全集-G(0,0)\)。
将 \(F(i,j)\) 代入原式子。后面那坨东西即为:
现在发现 \(3^{ij}\) 是最不好处理的,因为它使得不能使用二项式定理,先考虑这个的处理方法。
现在就可以处理了。
练习十(第二类斯特林数通项求法)
记 \({n\brace m}\) 表示把 \(n\) 个不同的物品划分为 \(m\) 个集合构成簇的方案数(不允许空集)。
解
我们先设 \(F(n,m)={n \brace m}\),\(G(n,m)\) 表示允许存在空集时的方案数。
易得 \(G(n,m)=\frac{m^n}{m!}\)。
钦定非空集合数,可以有: \(G(n,m)=\sum\limits_{i=1}^{m}{m \choose i}F(n,i)。\)
进行反演可得:\(F(n,m)=\sum\limits_{i=1}^{m}{m \choose i}(-1)^{m-i}G(n,i)。\)
代入可得:\({n\brace m} = f_{n,m}=\sum\limits_{i=1}^m{(-1)^{m-i}\binom mi\frac {i^n}{i!}}=\sum\limits_{i=1}^m{(-1)^{m-i}\frac{i^n}{i!(m-i)!}}\)。
这也是第二类斯特林数的通项公式。
卡特兰数
应用
Catalan 数列 \(H_n\) 是以下问题的方案数:
- 有一个大小为 \(n\times n\) 的方格图,左下角为 \((0, 0)\) 右上角为 \((n, n)\),从左下角开始每次都只能向右或者向上走一单位,不走到对角线 \(y=x\) 上方(但可以触碰)的情况下到达右上角有多少可能的路径?
- 在圆上选择 \(2n\) 个点,将这些点成对连接起来使得所得到的 \(n\) 条线段不相交的方法数?
- 一个栈的进栈序列为 \(1,2,3, \cdots ,n\) 有多少个不同的出栈序列?
- \(n\) 个结点可构造多少个不同的二叉树?
- \(n\) 对括号能组成的括号序列数?
递归/组合公式
通项公式
证明
其中 \(H_0=1,H_1=1\)。设它的普通生成函数为 \(H(x)\),利用卷积,得到它的一个方程。
解得
那么这就产生了一个问题:我们应该取哪一个根呢?我们将其分子有理化:
代入 \(x=0\),我们得到的是 \(H(x)\) 的常数项,也就是 \(H_0\)。当
\(H(x)=\dfrac{2}{1+\sqrt{1-4x}}\) 的时候有 \(H(0)=1\),满足要求。而另一个解会出现分母为 \(0\) 的情况(不收敛),舍弃。
因此我们得到了卡特兰数生成函数的封闭形式:
接下来我们要将其展开。使用牛顿二项式定理。
其中
于是
带回原式得到
这样我们就得到了卡特兰数的通项公式。
Min/Max容斥
定义
公式:
\(min/max\) 调换也成立
证明1(其实是我懒得写了摘的)
\(\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}\)
证明2
设存在一个以集合大小为自变量的函数 \(f\) 满足 \(\max{S}=\sum\limits_{T \subseteq S}f(|T|)\min T\)
记 \(S\) 中元素从大到小排列为 \(x_1,x_2,\cdots,x_m\),则对于 \(x_i\),其在左侧的贡献是 \(i=1\),在右侧的贡献为 \(\sum\limits_{j=0}^{i-1}{i-1 \choose j}f(j+1)\)
若等式成立,必有 \([i=1]=\sum\limits_{j=0}^{i-1}{i-1 \choose j}f(j+1)\)
设 \(F(i)=[i+1=1]\) (即 \([i=1]=F(i-1)\)),\(G(i)=f(i+1)\),则 \(F(i)=\sum\limits_{j=0}^{i}{i \choose j}G(j)\)
反演一下,得
因为 \(F(i)\) 只在 \(i=0\) 时有值,所以 \(G(i)=(-1)^i\)。
故有 \(f(i)=G(i-1)=(-1)^{i-1}\)。
因而构造成立。
\(kth\min-\max\) 证明同理
应用
Min-Max 容斥及推广常用于解决 元素都出现的期望时间 的问题,处理方法:
记 \(t_i\) 表示第 \(i\) 个元素出现的时间,则:
- \(\max(S)\) 表示 \(S\) 中 \(t\) 的最大值,即所有元素出现的时间。
- \(\min(S)\) 表示 \(S\) 中 \(t\) 的最小值,即至少一个元素出现的时间。
根据 Min-Max 容斥可以用 \(\min(S)\) 求 \(\max(S)\)
等式两边同时取期望,由于期望的线性运算,可以直接放到 \(\sum\) 中,即
然后发现 \(E(\min T)\) 很好求,就是一个元素出现的期望时间。
即可求解。
练习十一
给定三个序列 \(a_i,b_i,c_i\),求
\(n\leq2\times10^5\)
解
先用容斥拆开 \(max\):
最后一项与原式抵消掉,剩下的两种 \(min\) 中,第一种可以直接求出,第二种可以化成以下形式:
所以可以变成:
这个实质就是求顺序对(二维偏序),总复杂度 \(O(n \log n)\)。
练习十二
给 \(n\) 个元素,每次会随机选择一个,有 \(p_i\) 的概率选择第 \(i\) 个,问第一次所有元素都被选择过的期望时间。
\(1\leq n\leq20\)
解
设每个元素被选择时的时间为 \(t_i\),那么所有元素被选就是 \(t_{maxS}\),套上公式:
\(E(\min T)\) 的含义实际上就是第一次选到 \(T\) 中元素的期望时间,一次选中的概率是 \(\frac{1}{\sum\limits_{x\in T}p_x}\) ,期望时间就是其倒数 \(\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\)。
解
相当于就是求 \(t_i\) 第 \(k\) 小,思路大体上与上一题差不多,我们不妨改成求 \(n-k\) 大,让 \(k=n-k\),就能得出式子:
现在麻烦的是 \(\frac{M}{\sum\limits_{x\in T}p_x}\),我们发现所有 \(p_i\) 之和不会超过 \(M\),所以可以考虑计算每一种 \(\sum\limits_{x\in T}p_x\) 作为分母的项的系数之和。考虑设 \(dp_{i,j}\) 表示前 \(i\) 个,分母和为 \(j\) 的项的系数和。
在转的时候会发现转不了,所以再设一个参数 \(l=|T|\)。
那么就有 \({|T|-1 \choose k-1}=\frac{|T|-1}{|T|-k}{|T|-2 \choose k-1}\) 。
这个复杂度过不了,所以换方法,因为 \({|T|-1 \choose k-1}={|T|-2 \choose k-1}+{|T|-2 \choose k-2}\),所以:
这样就是 \(O(nmk)\) 的了。
第二类斯特林数
含义
\({n \brace k}\) 表示将 \(n\) 个元素划分成 \(k\) 个\(\textbf{非空子集}\)的方案数。
特殊值
递推式
即考虑第 \(n\) 个元素放在哪个集合。要么在已经有的 \(k\) 个非空集合里选一个放进去,要么自己单开一个新的集合。
边界是 \({n \brace 0}=[n=0]\)。
第二类斯特林数生成函数
一个盒子装 \(n\) 个物品且盒子非空的方案数是 \([n>0]\)。我们可以写出它的EGF为
由 EGF 卷积的组合意义,\(F^k(x)\) 就是 \(n\) 个有标号物品放到 \(k\) 个 \(\textbf{有}\) 标号盒子里的EGF。而第二类斯特林数是 \(n\) 个有标号物品放到 \(k\) 个 \(\textbf{无}\) 标号盒子里的方案数,所以要再除以一个 \(k!\)
通项公式
证明
设将 \(n\) 个有标号物品放到 \(k\) 个有标号盒子(允许空盒子)的方案数为 \(G_i\);将 \(n\) 个有标号物品放到 \(k\) 个有标号盒子(不允许空盒子)的方案数为 \(F_i\)
由二项式反演
\(F_k\) 是有标号的盒子,第二类斯特林数是无标号盒子再除以一个 \(k!\)
第一类斯特林数
含义
\(\Large{n \brack k}\) 表示将 \(n\) 个元素排成 \(k\) 个 \(\textbf{轮换}\) 的方案数。也即所有 \(n!\) 个排列中,构成的置换有 \(k\) 个环的排列数。
特殊值
递推式
即考虑第 \(n\) 个元素放在哪个轮换里。要么在已经有的 \(k\) 个轮换里选一个位置插进去,方案数是 \(n-1\);要么自己单开一个新的轮换。
生成函数
类似第二类斯特林数地,我们先考虑 \(1\) 个盒子,即 \(k=1\) 时 \(\begin{bmatrix}n\\1\end{bmatrix}=(n-1)!\) 的 EGF:
那么 \(n\) 个元素组成 \(k\) 个 \(\textbf{无}\) 标号轮换的 EGF 为
即
\(Ex\):第一类斯特林数没有实用的通项公式。
特殊等式行之和
我们知道一个有 \(n\) 个元素的排列和一个 \(n\) 个元素的置换一一对应,于是对所有置换中的轮换个数求和,我们有
通常幂、下降幂、上升幂转换
互相转换公式
证明都可以使用数学归纳法
反转公式
把上面的式子结合起来即可。
拓展公式
-
\[{n+1 \brace m+1} = \sum_k \binom{n}k{k \brace m} \]
组合意义:枚举 \(k\) 表示 \(n+1\) 号节点所在的集合之外剩下了 \(k\) 个节点,这 \(k\) 个节点要构成 \(m\) 个集合。
-
\[{n+1 \brack m+1} = \sum_k{n \brack k} \binom km \]
组合意义:还是枚举 \(n+1\) 号点所在环的大小,设为 \(t+1\),那么方案数应该是 \(t! {n-t \brack m}\),这 \(t!{n-t \brack m}\) 个方案对应 \({n \brack 0},{n \brack 1},\cdots, {n \brack n}\) 的所有置换中不连接这 \(t\) 个和剩下 \(n-t\) 个点的所有置换,所以有上式。
-
\[{n \brace m} = \sum_{k}\binom{n}{k}{k+1 \brace m+1}(-1)^{n-k} \]
-
\[{n \brack m} = \sum_k {n+1\brack k+1}\binom km (-1)^{m-k} \]
这是前两个式子的二项式反演
-
\[{m+n+1 \brace m}=\sum_{k=0}^m k{n+k \brace k} \]
\( \text{原式} = \sum_{k=0}^m{n+k+1 \brace k}-{n+k \brace k-1}={m+n+1 \brace m} \)
-
\[{m+n+1 \brack m}=\sum_{k=0}^m (n+k){n+k \brack k} \]
同 5 理
斯特林反演
形式
证明
我们有反转公式
直接带入易证
也有以下形式,与二项式反演类似: