组合数学
一些组合数学的证明
组合数
基础内容
定义
定义 \(\binom{n}{m}\) 为在 \(n\) 个数中选 \(m\) 个数的方案数(不考虑顺序,顺序不同算一个),等同于 \(C_n^m\)。
\(A_n^m=\frac{n!}{(n-m)!},C_n^m=\frac{A_n^m}{m!}=\frac{\frac{n!}{(n-m)!}}{m!}=\frac{n!}{m!(n-m)!}.\)。
阶乘与下降幂
\(a^\underline{n}=\left\{ \begin{array}{lr} 1 & n=0 \\ a\times(a-1)^\underline{n-1} & n\ge 1\\ \end{array} \right.\)
即 \(a^\underline{n}=a(a-1)(a-2)\dots(a-n+1)=\frac{a!}{(a-n)!}=A_a^n\)
广义二项式系数: \(\binom{a}{n} = \frac{a^\underline{n}}{n!}\)
对称公式: \(\binom{n}{m} = \binom{n}{n-m}\)
加法公式: \(\binom{n}{m} = \binom{n-1}{m} + \binom{n-1}{m-1}\)
吸收公式: \(m\binom{n}{m} = n\binom{n-1}{m-1}\)
三项式恒等式: \(\binom{a}{b}\binom{b}{c}=\binom{a}{c}\binom{a-c}{b-c}\)
恒等式
上指标求和: \(\sum\limits_{i=a}^{b} \binom{i}{a}=\binom{b+1}{a+1}\)
平行求和: \(\sum\limits_{i=0}^n\binom{a+i}{i}=\binom{a+n+1}{n}\)
二项式定理
\((a+b)^n=\sum\limits_{i=0}^n\binom{n}{i}a^ib^{n-i}\)
下降幂也满足二项式定理:
\((a+b)^\underline{n}=\sum\limits_{i=0}^n\binom{n}{i}a^\underline{i}b^\underline{n-i}\)
范德蒙德卷积恒等式: \(\sum\limits_{i=0}^{a}\binom{n}{i}\binom{m}{a-i}=\binom{n+m}{a}\)
上指标范德蒙德卷积恒等式: \(\sum\limits_{i=a}^{n-b}\binom{i}{a}\binom{n-i}{b}=\binom{n+1}{a+b+1}\)
经典子问题
插板法
Problem 1
把 \(n\) 个相同的球放入 \(m\) 个不同的盒子里,每个盒子内可以放 \([0,n]\) 个球,求总方案数。
可以这样理解:共有 \(n\) 个球,\(m-1\) 个隔板,总长度为 \(n+m-1\),我们要在其中找到 \(m-1\) 的位置变成隔板,使得最终有 \(m\) 个区间(盒子),所以最终答案为 \(\binom{n+m-1}{m-1}\)
Problem 2
对于变量 \(x_1,x_2,\dots,x_n\),每个变量都有一个下界 \(x_i \le a_i\),求满足 \(\sum\limits_{i=1}^n x_i = k\) 的序列的数量。
注意到 Problem 1 其实是当前问题下所有 \(a_i = 0\) 的情况,所以此题我们只需将供选择的位置的数量减去所有 \(x_i\) 的下界之和即可,即 \(\binom{\sum\limits_{i=1}^n (x_i-a_i) + k-1}{k-1}\)。
P5520 [yLOI2019]青原樱
我们考虑,因为共有 \(m\) 个树苗且两个树苗间都必须要有间隔,所以我们不妨考虑有 \(m-1\) 个空位,那么剩下的位置就是 \(n-m+1\),所以就是在 \(n-m+1\) 个位置中放置 \(m\) 个树苗。
但要注意此题和 Problem \(1,2\) 的不同在于,这里的每个树苗是不同的(即看分类的东西是否相同),即考虑顺序,所以最终的答案是 \(A_{n-m+1}^m\)。
环排列
Problem 1
在 \(n\) 个物品中选出 \(m\) 个排成一个环,求方案数(旋转算一个,翻转不算一个)。
先考虑选 \(m\) 个排成序列的方案数为 \(A_n^m\),又因为 \(m\) 个序列是一个环,所以最终答案是 \(\frac{A_n^m}{m}\)。
多重集的排列数
有 \(k\) 种不同的元素,每种元素有 \(a_i\) 个,求将其排成一列的方案数。
先考虑将所有的元素都视为不同种,最后再除去重复的部分,即 \(\frac{(\sum\limits_{i=1}^k a_i)!}{\prod\limits_{i=1}^k a_i!}\)。
特殊数列
组合数相关数列
错排
如果一个序列的每一位的值都与下标不相等,则称这个序列为错位排列。
Problem 1
求长度为 \(n\) 的错排数量。
令 \(D_n\) 表示为 \(n\) 的错排数量。对于一个排列 \(a_1,a_2,\dots,a_n\),记 \(a_n=u\),则有 \(u \not= n\),考虑 \(a_u\) 的取值:
当 \(a_u=n\) 时,剩下的 \(n-2\) 个数构成错排,方案数为 \((n-1)D_{n-2}\);当 \(a_u \not= n\) 时,我们交换 \(a_n\) 和 \(a_u\),此时 \(a_u=u\),我们将 \(a_u\) 删去,剩下的 \(n-1\) 个数构成错排,方案数为 \((n-1)D_{n-1}\)。
所以 \(D_n=(n-1)(D_{n-1}+D_{n-2})\)。
卡特兰数
令 \(C_n\) 表示长度为 \(2n\) 的合法括号序列的数量,则称序列 \(C\) 为卡特兰数。
枚举第一个括号内部的括号数量 \(C_i\),则转移式为 \(C_n=\sum\limits_{i=1}^{n-1} (C_i C_{n-1-i})\)。
关于卡特兰数常见的公式:
\(C_n=\frac{\binom{2n}{n}}{n+1}\),\(C_n=\frac{C_{n-1}(4n-2)}{n+1}\),\(C_n=\binom{2n}{n}-\binom{2n}{n-1}\)
同时,\(C_n\) 还表示 \(n\) 个点的二叉树的数量、\(n\) 个元素依次出栈的出栈序列个数等。
P4921[MtOI2018]情侣?给我烧了!
令 \(g(n)\) 表示 \(n\) 对情侣全部错开的方案数,则最终答案为 \(\binom{n}{k}n^\underline{k}2^kg(n-k)\)【选 \(k\) 个情侣、\(k\) 个情侣的排数、每对情侣的男女的相对位置、其他 \(n-k\) 个情侣全部错开】
考虑预处理计算 \(g(n)\)。
分别考虑第一排两个人的情况:
-
两个男生
则选出两个男生的方案数为 \(n(n-1)\),再考虑他们伴侣的情况:
当其伴侣相邻时,则剩余的 \(n-2\) 对情侣也需要全部错开,方案数为 \(2(n-1)g(n-2)\)【两个女生在同一排、其他情侣也全部错开】;如果不相邻,则假定他们是一对情侣,此时需要有 \(n-1\) 个情侣不相邻,即 \(g(n-1)\)。
所以总方案数为 \(n(n-1)(2(n-1)g(n-2)+g(n-1))\)。
-
两个女生
同上,总方案数为 \(n(n-1)(2(n-1)g(n-2)+g(n-1))\)。
-
一男一女
因为是 \(n\) 个情侣错开,所以这一男一女一定不是情侣。
同 \(1\),选出第一排的这两个人的方案为 \(2n(n-1)\)【一男一女的左右位置、选出一男一女】,伴侣相邻的方案数为 \(2(n-1)g(n-2)\),不相邻的方案数为 \(g(n-1)\),总方案数为 \(2n(n-1)(2(n-1)g(n-2)+g(n-1))\)。
综上所述,可以得出 \(g(n)\) 的递推式 \(g(n)=4n(n-1)(2(n-1)g(n-2)+g(n-1))\)。
第二类斯特林数
基础定义及求法
定义第二类斯特林数 \(n\brace m\) 表示将 \(n\) 个不同元素划分成 \(m\) 个集合(集合无标号且不能有空集)的方案数。
考虑递推计算 \(n\brace m\),当加入第 \(n\) 个元素时,存在一下两种情况:
将新元素单独放入一个子集,方案数为 \(n-1 \brace m-1\);
将新元素放入一个现有的非空子集,方案数为 \(m\times\) \(n-1 \brace m\)。
利用加法公式,可得递推式 \({n\brace m}=m {n-1\brace m} + {n-1 \brace m-1}\),边界条件为 \({n\brace 0}=[n=0]\)。
普通幂转下降幂
\(m^n=\sum\limits_{i=0}^n {n\brace i} m^\underline{i}\)
证明:
考虑组合意义,等式左侧可以看成把 \(n\) 个物品放入 \(m\) 个有标号盒子的方案数;等式右边可以看做枚举非空的盒子数量 \(i\),放入 \(i\) 个无编号非空盒子的方案数是 \(n\brace m\),给这 \(i\) 个盒子分配编号的方案数是 \(m^\underline{i}\),然后对 \(i\) 求和。
自然数 \(k\) 次幂和
给定 \(n(n\le 10^9),k(k\le 5000)\),求 \(\sum\limits_{i=0}^n i^k\)。
常见方法是使用拉格朗日插值 \(O(k)\) 解决,这里给出使用第二类斯特林数解决的方法。
根据广义二项式系数 \(\binom{a}{n} = \frac{a^\underline{n}}{n!}\) 可得 \(a^\underline{n}=n!\binom{a}{n}\),同时套用普通幂转下降幂,我们可得到原式 \(=\sum\limits_{i=0}^n \sum\limits_{j=0}^k {k\brace j} j!\binom{i}{j}\)。
交换一下位置,可得 \(\sum\limits_{j=0}^k {k\brace j} j! \sum\limits_{i=0}^n \binom{i}{j}\)。
因为当 \(i\le j\) 时 \(\binom{i}{j}\) 才有意义(即 \(i<j\) 时无意义),所以原式可变形为 \(\sum\limits_{j=0}^k {k\brace j} j! \sum\limits_{i=j}^n \binom{i}{j}\)。
此时我们套用上指标求和公式 \(\sum\limits_{i=a}^{b} \binom{i}{a}=\binom{b+1}{a+1}\),可得原式为 \(\sum\limits_{j=0}^k {k\brace j} j! \binom{n+1}{j+1}\)。
接下来,我们先让原式乘上 \(j\),可得 \(\sum\limits_{j=0}^k {k\brace j} (j+1)! \binom{n+1}{j+1}\),利用广义二项式系数 \(\binom{a}{n} = \frac{a^\underline{n}}{n!}\) 可得 \(n!\binom{a}{n}=a^\underline{n}\),我们令原式中的 \(j+1\) 为此处的 \(n\),令原式中的 \(n+1\) 为此处的 \(a\),可得 \(\sum\limits_{j=0}^k {k\brace j} (n+1)^\underline{j+1}\)。最后为了等式平衡,除以原先乘上的 \(j\),得到最终结果 \(\sum\limits_{j=0}^k {k\brace j} \frac{(n+1)^\underline{j+1}}{j+1}\)。
P6620 [省选联考 2020 A 卷] 组合数问题
给定 \(n,x,p,m\) 和 \(m\) 次多项式 \(f(x)=\sum\limits_{i=0}^m a_i x^i\),求 \((\sum\limits_{k=0}^n f(k)\times x^k \times \binom{n}{k})\mod p\)。
其中,\(1\le n,x,p\le 10^9,0\le a_i\le 10^9,0\le m\le \min(n,1000)\)。
考虑将 \(f(x)\) 中的单项式转化为下降幂的形式,即 \(f(x)=\sum\limits_{i=0}^m b_i x^\underline{i}\)。
接下来考虑如何计算 \(b\)。
我们先对原式使用普通幂转下降幂的形式,将 \(f(x)\) 中的单项式展开,得到 \(f(x)=\sum\limits_{i=0}^m a_i \sum\limits_{j=0}^i {i\brace j} x^\underline{j}\)。
稍作改写,可得 \(f(x)=\sum\limits_{j=0}^m (\sum\limits_{i=j}^m a_i {i\brace j})x^\underline{j})\),因此我们可得 \(b_i=\sum\limits_{j=i}^m a_j {j\brace i}\)。
将 \(f(x)\) 带入原式中,可得 \(\sum\limits_{k=0}^n \sum\limits_{i=0}^m b_i k^\underline{i} \binom{n}{k} x^k\)。
利用广义二项式系数变形 \(+\) 改变位置可得 \(\sum\limits_{i=0}^m b_i i!\sum\limits_{k=i}^n \binom{k}{i}\binom{n}{k} x^k\)。
再利用三项式恒等式 \(\binom{a}{b}\binom{b}{c}=\binom{a}{c}\binom{a-c}{b-c}\) 并稍作改写可得 \(\sum\limits_{i=0}^m b_i i!\binom{n}{i}\sum\limits_{k=i}^n \binom{n-i}{k-1} x^k\)。
不难发现它等同于 \(\sum\limits_{i=0}^m b_i i!\binom{n}{i}\sum\limits_{k=0}^{n-i} \binom{n-i}{k} x^{k+i}\),然后将 \(x^{k+i}\) 拆成 \(x^k x_i\),并将 \(x_i\) 提到外面,得 \(\sum\limits_{i=0}^m b_i i!\binom{n}{i} x_i \sum\limits_{k=0}^{n-i} \binom{n-i}{k} x^k\)。
接下来利用二项式定理 \((a+b)^n=\sum\limits_{i=0}^n\binom{n}{i}a^ib^{n-i}\),令 \(a=x,b=1,i=k,n=n-i\),此时我们可以忽略 \(b\) 的影响,得到最终式子为 \(\sum\limits_{i=0}^m b_i i! \binom{n}{i} x^i (x+1)^{n-i}\)。
最终,我们可以达到 \(O(m)\) 的计算和 \(O(m^2)\) 预处理的复杂度。
其他组合定理
鸽巢原理
把 \(n+1\) 个球放入 \(n\) 个盒子中,至少有一个盒子里有至少 \(2\) 个球。
推广:把 \(n\) 个球放入 \(k\) 个盒子中,则至少有一个盒子里有 \(\ge \lceil\frac{n}{k}\rceil\) 个球,至少有一个盒子里有 \(\le \lfloor\frac{n}{k}\rfloor\) 个球。
CF1305C Kuroni and Impossible Calculation
给定长度为 \(n\) 的序列 \(a\) 和一个整数 \(m\),求 \(\prod\limits_{1\le i<j\le n} |a_i-a_j|\mod m\)。
\(2\le n\le 2\times 10^5,1\le m\le 1000,0\le a_i\le 10^9\)。
考虑若存在一组 \(i,j\) 使得 \(a_i\equiv a_j(\mod m)\),则答案为 \(0\)。由鸽巢原理可知当 \(n>m\) 时必然有一组满足条件的 \(i,j\),因此只需暴力考虑 \(n\le m\) 的情况。
Prufer 序列
Prufer 序列可以将一个带标号 \(n\) 个节点的树用 \([1,n]\) 中的 \(n-2\) 个整数表示(即 \(n\) 个点的完全图的生成树与长度为 \(n-2\) 值域为 \([1,n]\) 的数列构成的双射)。
构造方式如下:
每次选择一个编号最小的叶子节点并删掉它,然后在序列中记录下它连接到的那个节点的编号,重复 \(n-2\) 次后就只剩下两个节点,算法结束。
Prufer 序列与树的相互转化
给定树,求 Prufer 序列:
用堆维护所有的叶子节点即可。
给定 Prufer 序列求树:
首先给出结论:度数为 \(a\) 的点在 Prufer 序列中的出现次数为 \(a-1\)。
具体构造方法如下:
-
取出 Prufer 序列中最前面的元素 \(x\)。
-
取出在点集中的、且当前不在 Prufer 序列中的最小元素 \(y\)。
-
在 \(x,y\) 之间连边(注意将 \(y\) 从点集中删除,并将其在 Prufer 序列里的出现次数减一)。
-
最后将点集中剩下的两个点连边
凯莱定理
\(n\) 个点的无根树计数
\(n\) 个点的有标号无根树的个数是 \(n^{n-2}\)(即 \(n\) 个点的完全图的生成树的数量是 \(n^{n-2}\))。
不难证明任意一个长度为 \(n-2\) 的 Prufer 序列都可以构造出一个各不相同的生成树,值域在 \([1,n]\),故总数为 \(n^{n-2}\)。
\(n\) 个点的有根树计数
对于每棵无根树来说,每个点都有可能成为根,所以总数为 \(n^{n-1}\)。
\(n\) 个点的每个度数分别为 \(d_i\) 的无根树计数(P2290 [HNOI2004] 树的计数)
根据 Prufer 序列的性质,我们可以知道度数为 \(d_i\) 的点在 Prufer 序列中出现 \(d_i-1\) 次,那么这其实就是可重集排列数了,总共 \(n-2\) 个位置,每个 \(d_i\) 会出现 \(d_i-1\) 次,套上可重集排列数的公式,可得答案为 \(\frac{(n-2)!}{\prod\limits_{i=1}^n (d_i-1)!}\)。
Burnside 引理
Polya 定理
P4980【模板】Polya定理
给定一个 \(n\) 个点,\(n\) 条边的环,有 \(n\) 种颜色,给每个顶点染色,问有多少种本质不同的染色方案,对 \(10^9+7\) 取模。
我们称两个环本质不同,当且仅当不能通过旋转使得它们变得完全相同。
\(T\) 组数据,\(T\le 10^3,n\le 10^9\)。
对于一个环,我们称它任意旋转能得到的所有环构成一个轨道。轨道是环的集合,与生成这个集合的初始环无关。显然所有的环都分成了若干个轨道,而答案就是轨道的数量。
对于任意一个环,都存在一个最小的正整数 \(d\),使得这个环在旋转 \(d\) 格后会与自身重合。我们称 \(d\) 为这个环的最小循环节,容易发现,这个环所在轨道的大小为 \(d\),且 \(d\) 一定是 \(n\) 的因子。
把旋转看作变换,变换可以作用于环上,把一个环变成另一个环。
那么一共有 \(n\) 种变换。对于一个环,所以保持这个环不变的变换被称为这个环的稳定子。容易发现,一个循环节为 \(d\) 的环的稳定子大小为 \(\frac{n}{d}\)。
对于任意一个轨道,轨道内每个环的稳定子大小相等,且稳定子大小乘轨道大小等于 \(n\)。
由于一个轨道内所有环的稳定子大小之和恰好为 \(n\),因此,所有环的稳定子大小之和就等于 \(ans\times n\)。令 \(cric\) 表示变换,则有:\(ans\times n=\sum\limits_cric \frac{n}{d(cric)}\)。
算了,估了,反正也不会。
容斥原理
基本容斥
当我们需要计算不满足条件 \(A\) 的方案数时,有时可以使用总方案数来减去满足条件 \(A\) 的方案数。
即 \(\sum\limits_C[!A(C)]=\sum\limits_C 1-\sum\limits_C [A(C)]\),其中 \(C\) 表示一种方案,\(A(C)\) 表示这种方案是否满足条件 \(A\)。