Loading

[专题总结]组合计数,容斥(理论篇)

  • Always Remember: 当设计出来一个算法时,模拟看一种方案会被计算几遍是防止重复的最好办法。

本篇会从每种算法如何统计一种方案,为什么不会重复,为什么全部方案都能统计到入手。

入门级别:TwelveFold Way

虽然是基础,但是能做到直接反应出来答案是学好组合数学的第一步。
image
盗个图, 将有标号记为L(labelled) 无标号记为U(unlabelled) 那么一个问题可以用缩写代替。

A、无限制

B、每个盒子至少有一个球

C、每个盒子至多有一个球

如ULA表示 n 个无标号的球分给 m 个有标号的盒子,一共有多少种方案。

可以发现就一种方案是从球到盒子的一个映射。

  • LL型 :两种方案,若有任意一对点,编号相同,所处的集合编号不同,就视为不同。
  • LU型 :先分配球,之后把盒子按照某种方式排序后编号,使得一种分配方式只有一种编号方式。
    若有任意一对点,编号相同,所处的集合编号不同,就视为不同。
    这是处理不标号的基本方法,人工制造一个排序方式,使得一种集合只会被统计一次。
  • UL型 :\(n\) 个球全部不可区分,先分配球,再把球按照某种方式排序后编号,使得一种分配方式只有一种编号方式。
    若有任意一对点,编号相同,所处的集合编号不同,就视为不同。
  • UU型:先分配球,之后把盒子按照某种方式排序后编号,把球按照某种方式排序后编号,使得一种分配方式只有一种编号方式(先给谁编号不重要)。
    若有任意一对点,编号相同,所处的集合编号不同,就视为不同。

至此,我们发现,若标号,就是一种方案分配前就有标号,无标号,就是分配后去了区分才有标号。

LLA

\(\displaystyle m^n\) , 该式是将第 \(i\) 个球放到 第 \(j\) 个盒子内统计一次。
考虑一种最终的方案,对于所有的 \(x\), 第 \(x\) 个球在任意一个盒子内,都只会被统计一次。
根据乘法原理,一种最终的方案会且只会被统计一次。

LUA

\(\displaystyle\sum_{i=1}^m\begin{Bmatrix} {n} \\ {i} \end{Bmatrix}\) ,枚举最终有 \(i\) 个盒子不是空的,然后用第二类斯特林放进去。
注意这里盒子是无标号的,我们并不关心他在哪些盒子里面,因为那都一样。
考虑一种最终的方案,他的球被分配到 \(k\) 个盒子内,就会在我们枚举到 \(k\) 的时候被第二类斯特林统计到恰好一次。

\(\rm Another\ way \ of \ LLA :\displaystyle\sum_{i=1}^ {\min(n,m)} \binom{m}{i} i! \begin{Bmatrix} {n} \\ {i} \end{Bmatrix}\) ,枚举哪些盒子有球,用斯特林分配,再给盒子添加顺序。

ULA

\(\displaystyle\binom{n+m-1}{m-1}\) ,插板法经典题,制造 \(m\) 个空球,他们和原来的球不区分,然后在空隙中选出一些插上版。
考虑最终一种方案,由于 \(m\) 个盒子中一共有 \(n\) 个球,证明可以用下面的上指标求和法递归的去考虑。
枚举第一个集合有 \(x\) 个球,统计一次,然后乘上 \((n-x)\) 个球分配到 \(m-1\) 个盒子内的方案数,易知是子问题。
最后还是根据乘法原理,可知一种方案会且只会被统计一次。

UUA

\(\displaystyle \sum_{i=1}^{m}P_{n,i}\)\(P_{i,j}\) 是把 \(i\) 这个整数划分成 \(j\) 个整数,划分集合的方案数。
\(P_{i,j}=P_{i-1,j}+P_{i-j,j}\) 转移,我们保证集合内元素的个数不降,可以使得一种方案被统计一次。
考虑一种方案,若所有盒子球数都大于 \(1\) ,那就全体减一,否则删去是 1 的盒子,两种方式都转化成了子问题,并且在当前点统计一次。
这也是转移的实际意义和保证不降序列的一般方法。

LLB

LLA对空集合容斥 :\(\displaystyle\sum_{i=0}^{m} \binom{m}{i}(-1)^i(m-i)^n\)
或者LUB给盒子一个顺序 :\(\displaystyle\begin{Bmatrix} {n} \\ {m} \end{Bmatrix}*m!\)
顺便多一个恒等式。。 考虑第二种的正确性,通过直接乘 \(m!\) 给盒子标号的方法,只有球标号的时候才能用,因为任意两个盒子不标号也可以通过装的球去区分。

球不标号的时候,即使装了球的盒子也可能无法区分,需要乘多重集排列,就不太现实了。

比较简单的杂项

  • LUB : \(\begin{Bmatrix} {n} \\ {m} \end{Bmatrix}\) LUA的简化版。

  • ULB : \(\binom{n-1}{m-1}\) ULA的简化版。

  • UUB : \(P_{n,m}\)

  • LLC : \(\binom{n}{m}*m!\) 要硬说明还是上指标求和公式吧。

  • LUC : 盒子不区分,所以放得下就是1放不下就没有

  • ULC : 放得下直接 \(\binom m n\) 选出来放球的盒子。

  • UUC : 盒子不区分,所以放得下就是1放不下就没有

组合恒等式

  • \(\displaystyle \binom n m \binom m k = \binom n k \binom {n-k}{m-k}\) 组合意义,先选 \(m\) 再选 \(k\),等价于先选 \(k\) ,再选出来 \(m\) 中不含 \(k\) 的部分。
  • \(\displaystyle \prod_{i=1}^k \binom{a_i}{a_{i+1}}=\binom{a_1}{a_1-a_2,a_2-a_3,...,a_k-a_{l+1}}\) 其实这个就是多重集排列,你想凑成啥组合数就凑吧。
  • \(\displaystyle \sum_{i=m}^n \binom{i}{m}=\binom{n+1}{m+1}\) 上指标求和公式,简单证明就不断用递推式展开组合数,组合意义就是看走到 \((n-m,m+1)\) ,在 \((x,m)\) 的时候枚举 \(x\) 是什么。
  • \(\displaystyle \sum_{k=0}^n \binom{x+k}{k}=\binom{x+n+1}{x+1}\) 平行求和法,上指标求和公式用 \(\binom n m= \binom{n}{n-m}\) 凑一凑就行了。
  • \(\displaystyle \sum_{i=0}^n \binom {n-i}{i}=Fib_{n+1}\) 负号的平行求和法,\(Fib\) 的含义是每步可以走 \(1\) 或者 \(2\) ,最后走出来 \(n\) 的方案数, 这个柿子就是枚举走了几个 \(2\),然后把 \(1,2\) 分配。
  • \(\displaystyle \sum_{i=0}^n\ \binom n i x^i y^{n-i}=(x+y)^n\) 二项式定理,组合意义证明
  • \(\displaystyle \sum_{i=0}^n \binom x i \binom y {n-i}=\binom{x+y}{n}\) 范德蒙德卷积,组合意义就我总共要选 \(n\)
    个球,枚举在前 \(x\) 个里面选了多少个球。
  • \(\displaystyle \sum_{i=0}^n \binom {i}{x} \binom{n-i}{y}=\binom{n+1}{x+y+1}\) 上指标版范德蒙德卷积,要在 \(a+b+1\) 个球里面选择 \(x+y+1\) 个球,枚举第 \(x+1\) 个球的位置。
  • $\displaystyle \sum \binom {a+b} {a+k} \binom{a+b}{b+k} (-1)^k=\binom {a+b} b ,\sum \binom {a+b} {a+k} \binom{b+c}{b+k} \binom {c+a}{c+k}(-1)^k=\binom {a+b+c} {a,b,c} $ 只有这两个成立,证明考虑把组合数拆开 \(\binom n m = \binom {n-1} m + \binom{n-1}{m-1}\) ,展开组合数是求公式/证明的基本思路。
  • 具体数学表 5-3 里面还有一些恒等式,我虽然证明了,但是都是带负数指标的恒等式,感觉意义不大就不放上来了。

容斥-基础反演

子集反演,二项式反演,莫比乌斯反演,斯特林反演

这些都是基于一个恰好算一遍的公式,然后让不合法的东西算 \(0\) 遍。

莫比乌斯反演是因子上的多重集反演,有因数容斥和倍数容斥,只会把 \([x==1]\) 拆开绝对是没学会,见题不要去想拆 \([x==1]\), 这是最麻烦的方法,直接套用因数容斥或者倍数容斥就会简化许多。

他们的核心和容斥一样,就是去简化限制,把限制变松,容斥系数实在忘了现推也很简单。

容斥千万不要思维定式,比如说要求0个不合法,就想着枚举多少个不合法,时刻记住目的,让不合法算0遍而不是套模板!

概率和期望

一些概率论的底层的东西,可以更好的理解概率的本质。

首先介绍 样本空间 \(\Omega\) ,事件集合 \(F\) ,概率测度 \(P\)

样本空间是一个集合,一个事件就是样本空间的一个子集,所有事件的集合是 \(F\)
每个事件都有它发生的概率, \(P(S)\) 的定义就是 \(S\) 发生的概率。

再介绍随机变量 \(X\),他是一个由 \(\Omega \rightarrow \mathbb R\) 的函数,也就是给了每个事件一个权值。
一个随机变量的期望是 \(\sum_{w} P(w)\times X(w)\) ,也就是按概率加权之后每个事件的权值之和。

有了这个东西,一些比较困扰我们的东西就自然清楚了。
比如 \(E(x)^2\not=E(x^2)\) ,前者是求出按概率加权的权值和再平方,后者是按概率加权的权值的平方的和。
又比如期望的线性性,期望是把权值按概率加权求和,你把权值拆成很多份,只要保证加的权不变,就不会出任何问题。

一般的期望题目都是给你一个随机变量,在你知道样本空间和概率测度的情况下求它的期望。

容斥-min-max容斥及扩展

首先是 \(\rm min-max\) 容斥,考虑我们现在有一个集合 \(S\)

\[\min_{a_i\in S}=\sum_{T\subseteq S}(-1)^{|T|+1}\max_{a_i\in T},\max_{a_i\in S}=\sum_{T\subseteq S}(-1)^{|T|+1}\min_{a_i\in T} \]

证明还是考虑经典的 “一个元素被算几次”。
以第一个柿子为例子, 每个元素都会被统计 \(\sum_{i=0}^{kth-1}(-1)^i\binom n i=[kth==1]\)

一般直接用并没有什么用武之地,但是在期望里面很有用。
期望是有线性性的,在每个单独的样本里都满足上述柿子,那我们带上概率加权去统计当然也是正确的。
当然你可以粗暴一点,直接在等式两边都加 E 然后再把 sigma 拆开。

注意,最大值的期望并不等于期望的最大值,最大值的期望是每种样本里面的最大值按概率加权之后的结果。
所以,我们有 $\displaystyle E(\min_{a_i\in S})=\sum_{T\subseteq S}(-1)^{|T|+1}E(\max_{a_i\in T}),E(\max_{a_i\in S})=\sum_{T\subseteq S}(-1)^{|T|+1}E(\min_{a_i\in T}) $

\(\rm min-max\) 容斥还有 \(kth\) 的形式,根 \(min-max\) 容斥的关系就像 二项式反演 和 原始容斥 一样。

\[{\rm KthMax}_k(S) =\sum_{T\subseteq S}(-1)^{|T|-k} \binom {|T|-1}{k-1}\min_{a_i\in T} \]

证明还是考虑每个元素被算几遍就好了,每个人的极大的作为 \(\min\) 的集合的大小就是他的 \(\rm kth\) ,利用这个去容斥。

当然, \(\rm min-max\) 容斥还有在质因子上的情况,把 \(\sum \rightarrow \prod\) , \(\rm min,max\rightarrow gcd, lcm\) 即可。

斯特林数

都快NOI了,终于来填坑了,开工! 感觉网上总结的全的博客几乎没有,也许是我搜罗能力太差了。

两类斯特林和计算公式

第一类斯特林数

\(\begin{bmatrix} n \\ m\end{bmatrix}\) 的意义是把 \(n\) 个数划分成 \(m\) 个圆排列的方案数, \(i\) 个数的圆排列有 \(i-1\) 种。

还有一个更理性的思考方式:把 \(n\) 个数划分成 \(m\) 个集合,每一种划分方案对答案的贡献是 \(\prod (siz-1)!\)\(\begin{bmatrix} n \\ m \end{bmatrix}\) 就是所有方案的贡献之和。

递推式 \(\begin{bmatrix} n \\ m\end{bmatrix}=\begin{bmatrix} n -1\\ m-1\end{bmatrix}+(n-1)\begin{bmatrix} n -1\\ m\end{bmatrix}\) ,放到原来的圆排列里面,我们可以考虑放到任意一个元素后面,所以有 \(n-1\) 种选法。

第一类斯特林数有一个经典理解:考虑递推式,意义是在 \([0,n-1]\) 选择 \(n-m\) 个数,他们乘积的和。

第一个转移对应不选择 \(n-1\), 第二个对应选择,那么有一个经典的公式。

\(\displaystyle \sum_{i=0}^nx^i\begin{bmatrix} n \\ i\end{bmatrix}=\prod_{i=1}^n(x+i-1)=x^{\overline{n}}\) ,左边式子对应意义是要不选择 \(x\) 要不选择一个 \([0,n-1]\) 的数,那么右边也是,要不选择 \(x\) , 要不选择 \(i-1\)

第二类斯特林数

\(\begin{Bmatrix} n \\ m\end{Bmatrix}\) 的意义是把 \(n\) 个 物品划分到 \(m\) 个非空集合内的方案数,特点是点标号盒子不标号。

根据实际意义,写出递推式 \(\begin{Bmatrix} n \\ m\end{Bmatrix} = \begin{Bmatrix} n -1\\ m-1\end{Bmatrix}+m\begin{Bmatrix} n -1\\ m\end{Bmatrix}\) ,要么新开一个盒子,要不装到原来的盒子里面。

第二类斯特林数有 \(O(n)\) 计算一个的公式,我们可以通过容斥原理来理解它。

\(\displaystyle m!\begin{Bmatrix} n \\ m\end{Bmatrix}=\sum_{k=0}^m (-1)^k \binom{m}{k}(m-k)^n=\sum_{k=0}^m (-1)^{m-k} \binom{m}{k} k^n\) , 先把盒子变成有标号的,然后考虑容斥 (注意到一个事情,无标号根本无法容斥!), 钦定 \(i\) 个空盒子,然后剩下的随便选。

我们可以把它二项式反演,得到 \(x^n\) 的表达式。

\(\displaystyle x^n = \sum_{k=0}^x \binom{x}{k} k!\begin{Bmatrix} n \\ k\end{Bmatrix}=\sum_{k=0}^xx^{\underline{k}}\begin{Bmatrix} n \\ k \end{Bmatrix}\) ,其实直接理解这个式子更加简单,把 \(n\) 个球随便放到 \(x\) 个盒子里面,等价于我们把 \(n\) 个球划分成 \(k\) 个集合,然后把他们一个集合一个集合扔到不同的盒子里面。

第三类斯特林数

\(L_{n,m}\) 是拉赫数,代表 \(n\) 个元素分成 \(m\) 个排列的方案数。

简单递推式 \(L_{n,m}=L_{n-1,m-1}+(n+m-1)L_{n-1,m}\) , 可以插到任意一个元素后面。

通项公式 \(\displaystyle L_{n,m} = \binom{n-1}{m-1} \frac{n!}{m!}=\binom{n}{m} (n-1)^{\underline{m-n}}=\binom{n}{m} m^{\overline{n-m}}\)

证明考虑我们先从里面选出来每个排列的第一个元素,之后放置的第 \(i\) 个元素有 \(m+i-1\) 种放法,因为每个排列的开头不能放,其他的空隙地方都可以去放,所以是上升幂。

斯特林恒等式

过于复杂的恒等式,按自己搞不懂,感觉也没啥用,感兴趣自己具体数学,这里是基本恒等式。

  • \(\displaystyle \sum_{i=0}^n \begin{bmatrix} n \\ i\end{bmatrix}=n!\) ,这是排列的重要性质:一个排列必定可以划分成若干个置换,而任意一个置换的划分也可以对应一个排列,他们形成双射。
  • \(\displaystyle\begin{Bmatrix} n +1\\ m+1\end{Bmatrix}=\sum_{k=m}^n\binom{n}{k}\begin{Bmatrix} k \\ m\end{Bmatrix}\) 第二类斯特林基本恒等式,证明考虑其实是选出来 \(n-k\) 个元素和 \(1\) 在一个集合内,剩下的元素分成 \(m\) 个集合。
  • \(\displaystyle \begin{Bmatrix} n \\ m\end{Bmatrix} = \sum_{k=0}^n (-1)^{n-k}\binom n k \begin{Bmatrix} k + 1 \\ m + 1\end{Bmatrix}\) 第二类斯特林基本恒等式的二项式反演的结果,用来 展开/求和 斯特林数,是一个带容斥系数的式子。
  • \(\displaystyle \binom{n}{m}=\sum_{k=m}^n (-1)^{m-k} \begin{Bmatrix} n +1\\ k+1\end{Bmatrix}\begin{bmatrix} k\\ m\end{bmatrix}\) 第二类斯特林数基本恒等式斯特林的反演后的结果,用来 展开组合数,求和?这么麻烦的式子不知道有什么用武之地,不过自带容斥系数。
  • \(\displaystyle\begin{bmatrix} n +1\\ m+1\end{bmatrix}=\sum_{k=m}^n\begin{bmatrix} n \\ k\end{bmatrix}\binom{k}{m}\) 第一类斯特林基本恒等式 ,这个证明很重要,用的是置换环等的基本知识,我们先考虑这个式子的含义,选出来 \(k\) 个环,之后从这 \(k\) 个里面选择 \(m\) 个。 那么剩下了 \(k-m\) 个环,我们不从环的角度考虑它,而是从排列的角度考虑,那么他就是相当于枚举了所有 \(n\) 个点构成 \(m\) 个环和一个排列的情况,也就是说右边的式子其实等价于 \(\displaystyle \sum_{k=0}^n \binom n k \begin{bmatrix} k \\ m\end{bmatrix} (n-k)!\) ,又注意到长为 \(n\) 的一个排列唯一对应一个长为 \(n+1\) 的圆排列(证明可以考虑把环删掉一个特殊点),所以也就对应了 \(n+1\) 个点分成 \(m+1\) 个环的方案数。
  • \(\displaystyle \begin{bmatrix} n \\ m \end{bmatrix}=\sum_{k=m}^n \begin{bmatrix} n + 1\\k+1 \end{bmatrix} \binom{k}{m} (-1)^{m-k}\) 把上式斯特林反演即可,是一个带容斥系数的斯特林恒等式。
  • \(\displaystyle \binom{n}{m} (n-1)^{\underline{n-m}}=\sum_{k=m}^n\begin{bmatrix} n\\ k\end{bmatrix}\begin{Bmatrix} k\\ m\end{Bmatrix}\) 第三类斯特林基本恒等式 ,可以发现,是把 \(n\) 个元素分成 \(k\) 个置换环,再把置换环分成 \(m\) 个集合,那么一个置换环的集合相当于一个排列,所以相当于是 \(n\) 个元素构成 \(m\) 个排列的方案数,参见第三类斯特林数。
  • \(\displaystyle \sum_{k=1}^n \binom n k\begin{Bmatrix} k \\ A\end{Bmatrix} \begin{Bmatrix} n - k \\ B \end{Bmatrix} = \begin{Bmatrix} n \\ A + B \end{Bmatrix} \binom{A+B} A , \sum_{k=1}^n \binom n k\begin{bmatrix} k \\ A\end{bmatrix} \begin{bmatrix} n - k \\ B \end{bmatrix} = \begin{bmatrix} n \\ A + B \end{bmatrix} \binom{A+B} A\) 这两个柿子有显然的组合意义,选出来任意多个元素构成 \(A\) 个 ... , 剩下的构成 \(B\) 个 ... , 等于我先构成 \(A+B\) 个 ... , 再从里面选出来 \(A\) 个让你选任意个去构成。

上升幂,下降幂

定义一个数的上升幂 \(\displaystyle x^{\overline{k}}=\prod_{i=1}^k(x+i-1)\) ,下降幂 \(\displaystyle x^{\underline{k}}=\prod_{i=1}^k (x-i+1)\)

上升幂,下降幂之间可以相互转化
\(n^{\overline{m}}=(-1)^m(-n)^{\underline{m}}=(n+m-1)^{\underline{m}}\)
\(n^{\underline{m}}=(-1)^m(-n)^{\overline{m}}=(n-m+1)^{\overline{m}}\)

在幂之间转化的公式

\[x^n=\sum_{k=0}^n x^{\underline{k}} \begin{Bmatrix} n \\ k\end{Bmatrix}, x^{\underline{n}}=\sum_{k=0}^n(-1)^{n-k} \begin{bmatrix} n \\ k \end{bmatrix} x^k \]

\[x^{\overline{n}}=\sum_{k=0}^n x^k \begin{bmatrix} n \\ k\end{bmatrix}, x^n= \sum_{k=0}^n (-1)^{n-k} \begin{Bmatrix} n \\ k \end{Bmatrix}x^{\overline{k}} \]

其实这个就不用再额外记忆了,第二个可以直接实际意义,第一个可以实际意义之后二项式反演。
后面两个斯特林反演就出来了,所以都可以现场推。

上升幂,下降幂的二项式定理

\[(a+b)^{\underline{k}}=\sum_{i=0}^k \binom{k}{i} a^{\underline{i}} b^{\underline{k-i}} \]

\[(a+b)^{\overline{k}}=\sum_{i=0}^k \binom{k}{i} a^{\overline{i}} b^{\overline{k-i}} \]

证明的话考虑把上升幂下降幂写成阶乘乘组合数的形式 ,之后根据范德蒙德卷积和其上指标扩展形式即可证明。

斯特林反演

反转公式

\[\sum_{k=m}^n (-1)^{n-k}\begin{bmatrix} n \\ k \end{bmatrix} \begin{Bmatrix} k \\ m \end{Bmatrix} = [m==n] \]

还是考虑划分成 \(m\) 个排列,然后这些一个排列划分的贡献是每个排列里面 \((-1)\) 的置换环个数次方 的乘积。

考虑把 \(f(i)\)\(i\) 个元素划分成若干个置换环的带权方案数,奇数个置换环有 \(-1\) 的系数,偶数有 \(1\) 的系数。

那么 \(f(i)=[i==1]\) ,证明考虑 $n-C\equiv k \mod 2 $ , \(C\) 是置换环个数, \(k\) 是逆序对个数,证明参见矩阵树定理的吧。

所以唯一一种有值的方案是把 \(n\) 划分的每个排列大小都是 \(1\) ,这要求 \(m==1\) ,他的贡献是 \((-1)^n\) 正好和提出来的 \((-1)^n\) 抵消掉。

所以有斯特林反演公式

\[F_{n}=\sum_{i=0}^n \begin{bmatrix} n \\ i \end{bmatrix} G_i \Leftrightarrow G_n=\sum_{i=0}^n (-1)^{n-i} \begin{Bmatrix} n \\ i \end{Bmatrix} F_i \]

\[F_{n}=\sum_{i=n} \begin{bmatrix} i \\ n \end{bmatrix} G_i \Leftrightarrow G_n=\sum_{i=0}^n (-1)^{i-n} \begin{Bmatrix} i \\ n \end{Bmatrix} F_i \]

至于还有两个反演公式,也是类似的形式。

\[F_{n}=\sum_{i=0}^n \begin{Bmatrix} n \\ i \end{Bmatrix} G_i \Leftrightarrow G_n=\sum_{i=0}^n (-1)^{n-i} \begin{bmatrix} n \\ i \end{bmatrix} F_i \]

\[F_{n}=\sum_{i=n} \begin{Bmatrix} i \\ n \end{Bmatrix} G_i \Leftrightarrow G_n=\sum_{i=n} (-1)^{i-n} \begin{bmatrix} i \\ n \end{bmatrix} F_i \]

原因是 \(\displaystyle \sum_{k=m}^n (-1)^{n-k}\begin{Bmatrix} n \\ k \end{Bmatrix} \begin{bmatrix} k \\ m \end{bmatrix} = [m==n]\) ,找不到很有组合意义的证明。

欧拉数

欧拉数 \(\left\langle\begin{matrix} n \\ k \end{matrix}\right\rangle\) 是长度为 \(n\) 的排列 \(P\) 里面有 \(k\)\(P_i < P_{i+1}\)\(P\) 的个数, 我们把 \(P_i <P_{i+1}\) 叫做一个升高。

根据意义,有简单的递推式 \(\displaystyle \left\langle \begin{matrix} n \\ k \end{matrix}\right\rangle=(k+1)\left\langle \begin{matrix} n -1\\ k \end{matrix}\right\rangle + (n-k)\left\langle \begin{matrix} n -1\\ k-1 \end{matrix}\right\rangle\)

分别代表把 \(n\) 接在一个极长下降子序列开头不增加升高,和插在一个子序列中间增加升高。

当然,也可以直接容斥,得到 \(O(n)\) 计算一个 \(\left\langle \begin{matrix} n \\ k \end{matrix}\right\rangle\) 的通项公式。

先假设 \(f(k)\) 代表至少 \(k\) 个升高的方案数,那么相当于连了 \(k\) 条边,有 \(n-k\) 个联通块,我们可以先把它分出来再任意排列 \(f(k)=\begin{Bmatrix} n \\ n - k\end{Bmatrix}(n-k)!\)

然后直接二项式反演,得到 \(\left\langle \begin{matrix} n \\ k \end{matrix}\right\rangle\) 的表达式 :

\[\left\langle \begin{matrix} n \\ k \end{matrix}\right\rangle=\sum_{i=k}^{n} (-1)^{i-k} \binom{i}{k} \begin{Bmatrix} n \\ n - i\end{Bmatrix}(n-i)! \color{purple}{初始公式} \]

\[=\sum_{i=k}^{n} (-1)^{i-k} \binom{i}{k} \sum_{j=0}^{n-i}(-1)^{n-i-j}\binom{n-i}{j}j^n \]

\[=\sum_{j=0}^{n-k}j^n\sum_{i=k}^{n-j}(-1)^{i-k}(-1)^{n-i-j}\binom i k \binom{n-i}{j} \]

\[=\sum_{j=0}^{n-k} (-1)^{n-k-j} j^n \binom{n+1}{j+k+1} \]

同时利用 \(\left\langle \begin{matrix} n \\ k \end{matrix}\right\rangle=\left\langle \begin{matrix} n \\ n-k-1 \end{matrix}\right\rangle\) 我们可以对上述公式继续化简成 \(O(k)\) 求一个的公式,令 \(k=n-k-1\)

\[=\sum_{j=0}^{k+1} (-1)^{k+1-j} j^n \binom{n+1}{k+1-j} =\sum_{j=0}^{k} (-1)^{k-j} (j+1)^n \binom{n+1}{k-j}=\sum_{j=0}^k(-1)^k(k-j+1)^n\binom{n+1}{j} \]

后面两步分别是整体加一和 \(j=k-j\)

同时还有恒等式 \(\displaystyle m! \begin{Bmatrix} n \\ m \end{Bmatrix} = \sum_{k=n-m}^n \left\langle \begin{matrix} n \\ k \end{matrix}\right\rangle \binom k {n - m}\) 直接就是初始公式二项式反演之前的东西。

$\rm Worpitzky $ 恒等式 : \(\displaystyle x^n=\sum_{k=0}^n \left\langle \begin{matrix} n \\ k \end{matrix}\right\rangle\binom{x+k} n\)

证明考虑 \(\displaystyle x^n=\sum_{k=0}^n\binom{x}{k}k!\begin{Bmatrix} n \\ k\end{Bmatrix}\) 再把上面的 \(m!\begin{Bmatrix} n \\ m \end{Bmatrix}\) 带入。
\(\displaystyle \sum_{k=0}^n\binom x k \sum_{t=n-k}^n \left\langle\begin{matrix} n \\ t \end{matrix}\right\rangle \binom t {n-k}=\sum_{t=0}^n\left\langle\begin{matrix} n \\ t \end{matrix}\right\rangle\sum_{k=n-t}^n\binom x k \binom t {n-k}=\sum_{t=0}^n\left\langle\begin{matrix} n \\ t \end{matrix}\right\rangle \binom{x+t}{n}\)

也是展开一个 \(x^n\) 的方法,不知道什么时候会有用。

斐波那契数列

基本性质

\(Fib_0=0,Fib_1=1,Fib_i=Fib_{i-1}+Fib_{i-2}(i \geq 2)\) .

\(Fib\) 数列有很多性质,但绝大多数没有用.
证明他们的常用手法有差分,拆开一个Fib数,把等式移项 \(Fib_{i-2}=Fib_{i}-Fib_{i-1}\) 等等。

  • \(\sum_{i=1}^n Fib_i=Fib_{n+2}-1\) ,根据 \(Fib_{i}=Fib_{i-1}+Fib_{i-2}\) 不断拆开 \(Fib_{i-1}\) 即可。
  • \(\sum_{i=1}^n Fib_{2i-1}=Fib_{2n}\) ,根据 \(Fib_{i}=Fib_{i-1}+Fib_{i-2}\) 不断拆开 \(Fib_{i-2}\) 即可。
  • \(\sum_{i=1}^n Fib_{2i}=Fib_{2n+1}-1\) ,根据 \(Fib_{i}=Fib_{i-1}+Fib_{i-2}\) 不断拆开 \(Fib_{i-2}\) 即可。
  • \(\sum_{i=1}^n (-1)^i Fib_i\) 这个分奇偶性讨论一下,用 \(Fib_{i-2}=Fib_{i}-Fib_{i-1}\) 变成奇偶求和的形式。
  • \(Fib_{n}=Fib_{m}*Fib_{n-m+1}+Fib_{m-1}*Fib_{n-m}\) 对于这个我们不断拆 \(Fib\) ,如下。
    \(Fib_{i-1}+Fib_{i-2}=2*Fib_{i-2}+Fib_{i-3}=3*Fib_{i-3}+2*Fib_{i-4}=5*Fib_{i-4}+3*Fib_{i-3}\)
    然后就可以发现系数的规律了,当然可以数学归纳法,没什么意义。
  • \(\sum_{i=1}^n Fib_i^2=Fib_{n}*Fib_{n+1}\) 不断展开 \(Fib_{n+1}\),留下平方和。
  • \(Fib_{n-1}Fib_{n+1}=Fib_{n}^2+(-1)^n\)\(\frac{Fib_{2n}}{Fib_{n}}=Fib_{n+1}+Fib_{n-1}\) 这个就归纳吧..... 不会证。

数论相关

  • \(\gcd(Fib_i,Fib_{i-1})=1\) ,从 \(1\) 开始就互质,那么 \((a+b,a)=(b,a)\) 我们可以归纳。
  • \(\gcd(Fib_n,Fib_m)=Fib_{\gcd(n,m)}\) ,利用 \(Fib_{n}=Fib_{m}*Fib_{n-m+1}+Fib_{m-1}*Fib_{n-m}\) 拆开 \(Fib_n\)
    \(\gcd(Fib_n,Fib_m)=\gcd(Fib_{m}*Fib_{n-m+1}+Fib_{m-1}*Fib_{n-m},Fib_m)=\gcd(Fib_{m-1}*Fib_{n-m},Fib_m)=\gcd(Fib_{n-m},Fib_m)\) 辗转相除即可证明。
    这个结论可以扩展到任意的递推式,满足 \(F_i=aF_{i-1}+bF_{i-2}\),证明方法类似。
  • \(n|m \Leftrightarrow Fib_n|Fib_m\) ,有上式直接推论。
  • Fib素数:\(Fib_x\) 比任何比他小的数都互质,一个数是 Fib 素数当且仅当 \(Fib_x\) 是素数或者 \(x=3,4\)

卡特兰数列

\((0,0)\)\((n,n)\) ,每次向上或向右,不跨过 \(y=x\) 的方案数。

跨过 \(y=x\) 肯定触碰 \(y=x+1\) , 我们再第一次触碰的时候把路径延 \(y=x+1\) 对称,得到终点是 \((n-1,n+1)\) 的一条路径。

考虑一条终点是 \((n-1,n+1)\) 的路径,把它第一次触碰 \(y=x+1\) 的时候对称一下,也就得到了跨过 \(y=x\) 的路径。

所以是双射,用任意路径减去不合法的,方案数是 \(\binom{2n}{n}-\binom{2n}{n-1}\)

还有一个更易懂的等价描述:一个栈有 \(n\) 个元素要进出栈,合法的进出栈序列个数,把进栈出栈看做向右向上,容易发现等价。

卡特兰还有一个重要的递推公式: \(\rm Cat_n=\sum_{i=1}^n Cat_{i-1}Cat_{n-i}\)

证明考虑那个栈,枚举第一个元素被弹出的时间 \(i\) ,然后后面的 \(n-i\) 个元素是一个等价问题,忽略第一个元素,第 \(2 -> i\) 的元素也是一个等价问题,所以这个公式是正确的。

\(Cat\) 的其他常用性质,摘自 ix35 。

顶点标号的凸 \(n\) 边形的三角剖分数量为 \(Cat_{n-2}\)
考虑写出递推式,平移一下下标就可以得到卡特兰数。

\(n\) 对括号的匹配括号串数量为 \(Cat_n\)
根据定义显然。

\(n\) 个点的无标号有根二叉树个数为 \(Cat_n\)​,左右儿子区分。
根据递推式得证。

\(n\) 个点的无标号有根树个数为 \(Cat_{n-1}\)​,儿子区分。
考虑删除根结点后的括号序即可。

Raney定理

有一个数列 \(a_1,a_2,...,a_n\) ,满足 \(\sum_i a_i = 1\) , 那么 \(a\) 的循环同构中恰好只有一个满足任意非空前缀和为正数。

大概是拉出来一条折线,之后找到最低的地方,发现这有这个地方满足所有的点在它上面。
循环同构还是主要是加一倍之后断环为链。

以下摘自 ix35 的博客

img

主要是因为 \([1,n]\) 里面不可能有人和他斜率相同,所以可以凭借这个推广一下到 \(\rm (n,m)-dyck\) 公式:
\((0,0)\)\((n,m)\) ,不经过 \(y=\frac{m}{n} x\) 下面,这样的路一共有 \(\frac{\binom{n+m}{m}}{n+m}\) 条。

证明还是考虑一种循环同构只有一个合法,因为 \((n,m)=1\) ,所以要想斜率相同只能横坐标差是 \(n\) 的倍数。

P6672 [清华集训2016] 你的生命已如风中残烛

只考虑前 \(m\) 项,把所有的数都减一,发现任意前缀和都 \(\geq 0\) 就合法, 且 \(sum = 0\)

考虑往 Raney 上凑,首先考虑往序列开头加一个 \(1\) ,这样就能用 Raney 定理了,于是本题做完了!

当然不对,这是一个单射,映射回来的时候会重复,因为我们无法保证开头的 \(1\) 在循环中跑到哪里了。

有没有什么方式,使我们加进去的东西在一个固定的位置呢?

在序列末尾加一个 \(-1\), 再把所有数取负再 reverse 这个序列,他就满足 Raney 的条件了,并且我们发现开头一定是 \(1\)

那么 \(\displaystyle Ans = \frac{\frac{(m+1)!}{m+1}}{n-m+1}\)\(n-m+1\) 是因为 \(n-m+1\)\(1\) 都可以去开头被删掉,每个方案重复 \(n-m+1\) 遍。

Cat_k

经典问题之 \(\rm Cat_k\), 求一个合法的进出栈序列,满足恰好空栈 \(k\) 次的方案数。

首先它是让你恰好触碰 \(k\)\(x=y\) ,为了表现出来触碰 \(x=y\) ,我们让每次触碰都向上都一格,就能表示出来他碰到了。

组合数学中用题目给的操作等价需要操作,是基本思路,也就是泛化条件为已有,在球盒中也有应用 (ARC110D)

然后使用经典操作:考虑一个合法方案如何被统计,那么我们考虑一个如下双射,使得每个路径被统计一遍。

先把触碰 \(y=x\) 的点全部向内压缩一格,因为你不能超过,所以你在 \(y=x\) 这条线上的时候肯定要往右走,走到 \(y=x\) 的时候肯定是往上走,我们把这两步压缩起来,那么他们中间就可以随意触碰 \(y=x\) 了。

然后我们在每个原本的触碰点把这条线的后面整体向上平移一格。

最终映射成了一条 到达 \((n-k-1,n-1)\) 且需要满足 不跨过 \(y=x+k\) 的路径。

考虑一条路径怎么映射回来:把它第一次跨过 \(y=x,y=x+1,y=x+2,...\) 的红线向下平移,再解压回来,就唯一对应了一条 \(\rm Cat_k\) 路径。

方案数是 \(\displaystyle \binom{n-k-1+n-1}{n-k-1}-\binom{n-k-1+n-1}{n-k-2}\) ,对所有的 \(k\) 求和可以得到catalan数

Cat_k 图解

\(\rm Cat_k\) 路径
img

压缩
img

向上平移
img

卡特兰扩展-格路计数

用来优化一类转移比较简单的 dp, 如果你得到一个 dp 转移很简单,可以想格路计数,如果转移并不简单,可以考虑使用前缀和等手法让他变得简单

参考这篇文章 ,感觉也不是特别有意义,里面的第五个我也没看,简记一个吧。

格路计数中,看到必须经过,就要想到对称,不仅是路径的对称,必须经过意味着一些等价,也就是他们重新拥有一个共同的起点:这条线。

定义一条路径的权值是它和 \(y=x+k\) 的相交次数,求所有 \((0,0)\)\((a,b)\) 的路径的权值之和, \(q\) 是询问次数,\(q,a,b,k \leq 1e5\)

首先先讨论一下起点终点是否在 \(y=x+k\) 异侧,如果不是那么可以把终点按 \(y=x+k\) 对称一下,由于有权值的路径毕竟经过这条线,在最后一次向都是一样的。

一个简单的想法是枚举交点之后线性性拆开, \(\sum_x \binom{2x+k}{x}\binom{a+b-2x-k}{a-x}\) , 这个柿子并没有下手方向。

一种统计权值和的全新的手段,单独统计所有的权值一次,再考虑剩下的权值的贡献

\(f(a,b,k)\) 代表终点是 \((a,b),y=k\) 的答案, 让 \(T(x,y,a,b) = \binom{a-x+b-y}{a-x}\), 也就是 \((x,y)\)\((a,b)\) 的方案数。

\[f(a,b)=T(0,0,a,b)+\sum_{x} T(0,0,x,x+k) g(x,k) \]

\(g(x,k)\) 代表从 \((x,x+k)\) 出发,之后还会在经过一次 \(y=x+k\) 的方案数,相当于我们把所有最后一次经过的都统计了一次,然后剩下所有后面再经过的,也就是类似 \(dp\) 的思想。

\(g(x,k)=T(x+1,x+k,a,b)\times2\) , 因为它本来是从 \((x+1,x+k)\)\((x, x+k+1)\)\((a,b)\) 且必须经过 \(y=x+k\) 的方案数,但是由于必须经过 \(y=x+k\) ,那么利用 对称 的思想,他们的方案是相同的,并且 \((x+1,x+k)\)\((a,b)\)\(y=x+k\) 异侧,所以一定会经过。

\[f(a,b)=T(0,0,a,b)+ 2 \sum_x T(0,0,x,x+k)T(x+1,x+k,a,b) \]

\[=T(0,0,a,b)+ 2 \sum_x T(0,0,x,x+k)T(x,x+k,a-1,b) \]

\[=T(0,0,a,b)+ 2 f(a-1,b)=\sum_{i=0}^a 2^i f(a-i,b)=\sum_{i=0}^a 2^i\binom{a+b-i}{b} \]

\[=\sum_{i=b}^{a+b} 2^{a+b-i} \binom{i}{b}=\sum_{i=0}^{a+b} 2^{a+b-i} \binom{i}{b} \]

这个东西是可以莫队的,具体的,如果 \(a\) 变化,那么×2再加上新的项即可,如果 \(b\) 变化,利用 \(\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}\) ,利用解方程解出新的值。

该怎样解方程?

\[\sum_{i=0}^{a+b} 2^{a+b-i} \binom{i}{b}=\sum_{i=0}^{a+b} 2^{a+b-i} \binom{i-1}{b}+\sum_{i=0}^{a+b} 2^{a+b-i} \binom{i-1}{b-1} \]

\[=\sum_{i=0}^{a+b-1} 2^{a+b-1-i} \binom{i}{b}+\sum_{i=1}^{a+b-1} 2^{a+b-1-i} \binom{i}{b-1} \]

\[x = \sum_{i=0}^{a+b-1} 2^{a+b-1-i} \binom{i}{b} \rightarrow \sum_{i=0}^{a+b} 2^{a+b-i} \binom{i}{b}=2x+\binom{a+b}{b} \]

\(x\) 用原来的值表示,那么新的值就可以表示。

当然如果你在这个时候不会直接莫队,那么你可以接着化简柿子,也很套路。

对于组合数求和的问题还有一个套路就是 把东西搬到杨辉三角上 ,不断把这个东西向后递推,可以发现答案是组合数一行上的和,直接使用莫队解决, orz EI 的话就可以 polylog 了。

群论与置换

基本定义

群:给定一个集合 \(G\) 和 一个运算 \(*\), 满足如下性质,则称 \((G,*)\) 是一个群。

  • 封闭性:任意 \(a\in G, b\in G\) , 满足 \((a*b) \in G\)
  • 单位元:满足存在 \(e\) 使得 \(\forall a\in G, (a*e)=(e*a)=a\) , \(e\) 被称为单位元
  • 逆元:满足对于任意 \(a\in G\), \(a^{-1}\in G\), 其中, \(a^{-1}\) 满足 \(a*a^{-1}=e\)

置换:一个置换是一个矩阵满足,每一行,每一列只有一个 \(1\) 的特殊变换。

\(\begin{pmatrix} 1 & 2 & 3 & 4 \\ a_1 & a_2 & a_3 & a_4\end{pmatrix}\) 代表把第 \(i\) 个元素移动到第 \(a_i\) 个元素。

置换有乘法: \(a*b\) 就代表先做 \(a\) 的映射,再做 \(b\) 的映射产生的等价映射。
置换的乘法满足结合律,置换乘置换还是置换,置换也存在单位元和逆元,所以所有的置换形成一个群。

置换里有一个基本的套路是让 \(i\)\(a_i\) 连边,一个置换这么连边之后会形成若干个简单环。

Burnside/Polya

首先明白一些定义:我们是在给每个元素染色,然后元素之间存在若干个置换。

如果一种染色能通过另一种染色加若干置换得到,那么就称这两种染色是等价的。

那么,我们记使染色 \(\mathcal C\) 不变的置换的数量为 \(f(\mathcal{C})\), 记与染色 \(\mathcal{C}\) 等价的染色数为 \(g(\mathcal{C})\)

\({g(\mathcal{C})} = \frac{|G|}{f(\mathcal{C})}\), 证明可以直接考虑先把所有置换作用到这个颜色上面,现在有 \(|G|\) 种颜色。

然后我们考虑一个置换 \(f\) 得到了一个新颜色,那么,所有的 \(f*h, h\in f({\mathcal{C}})\) 都将得到这个颜色, 得证。

我们记在置换群 \(G\) 意义下,非等价着色数是 \(R(G)\) , 记在置换 \(f\) 意义下不改变的着色集合是 \(T(f)\)

  • Burnside 定理 : \(\displaystyle R(G)=\frac{1}{|G|} \sum_{f\in G} T(f)\) ,非等价着色数等于所有置换不变的着色的平均数。

证明:考虑对 std:pair<c(一种染色),f(一种置换使得染色c不变)> 进行计数。

第一种方法是枚举所有的置换,统计在这个置换下不改变的着色数, \(\sum_{f\in G} T(f)\) .

第二种方法是枚举所有的着色,统计使得这个着色不改变的置换数, \(\sum_{c\in \mathcal{C}} f(c)\) .

根据实际意义,有 \(\sum_{f\in G} T(f)=\sum_{c\in \mathcal{C}} f(c)\) , 带入 \(g(c)=|G|/f(c)\) .

\(|G|\sum_{c\in \mathcal{C}} \frac{1}{g(c)}=\sum_{f\in G} T(f)\) , 考虑这个东西:\(\sum_{c\in \mathcal{C}} \frac{1}{g(c)}\) , 统计每种有 \(g(c)\) 个颜色与 \(c\) 等价的颜色 \(\frac{1}{g(c)}\) 遍,那么最后的值就是非等价着色数, 也就是\(\sum_{c\in \mathcal{C}} \frac{1}{g(c)}=R(G)\)

故有 \(|G|R(G)=\sum_{f\in G} T(f), R(G)=\frac{1}{|G|}\sum_{f\in G} T(f)\)

  • Polya 引理: 感觉纯没用的一个东西: \(T(f)=k^{\#(f)}\)\(\#(f)\) 代表把 \(f\) 循环分解之后简单换的个数, \(k\) 代表颜色数。

证明很显然吧,每个循环必须染同一种色,否则在这种置换下就会改变。

鸽巢定理

这个东西的普通版就是 \(i+1\) 个球放到 \(i\) 个盒子里面,至少有一个盒子里面有两个球。

感觉用来证明一些东西的上届/下届还是比较好的,用来观察基本的性质,也可以用来构造。

还有一个扩展版:把 \(q_1+q_2+q_3+...+q_n-n+1\) 个球放到 \(n\) 个盒子里面,至少有一个 \(i\) 满足 \(i\) 的球 \(\geq q_i\) , 证明和普通鸽巢一样,先放 \(q_i-1\) 个,发现还多出来一个,必定导致一个 \(\geq q_i\)

还有一个比较好用的是 \(n\) 的数的平均数 \(\geq r\) , 那么至少有一个数 \(\geq r\) , 正确性显然,但是可以用来一些 总个数/总方案 得到平均数来证明,应用比较灵活。

posted @ 2022-05-20 07:09  Soresen  阅读(438)  评论(0编辑  收藏  举报