[专题总结]组合计数,容斥(理论篇)
- Always Remember: 当设计出来一个算法时,模拟看一种方案会被计算几遍是防止重复的最好办法。
本篇会从每种算法如何统计一种方案,为什么不会重复,为什么全部方案都能统计到入手。
入门级别:TwelveFold Way
虽然是基础,但是能做到直接反应出来答案是学好组合数学的第一步。
盗个图, 将有标号记为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\) 。
证明还是考虑经典的 “一个元素被算几次”。
以第一个柿子为例子, 每个元素都会被统计 \(\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\) 容斥的关系就像 二项式反演 和 原始容斥 一样。
证明还是考虑每个元素被算几遍就好了,每个人的极大的作为 \(\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}}\)
在幂之间转化的公式
其实这个就不用再额外记忆了,第二个可以直接实际意义,第一个可以实际意义之后二项式反演。
后面两个斯特林反演就出来了,所以都可以现场推。
上升幂,下降幂的二项式定理
证明的话考虑把上升幂下降幂写成阶乘乘组合数的形式 ,之后根据范德蒙德卷积和其上指标扩展形式即可证明。
斯特林反演
反转公式
还是考虑划分成 \(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\) 抵消掉。
所以有斯特林反演公式
至于还有两个反演公式,也是类似的形式。
原因是 \(\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=\left\langle \begin{matrix} n \\ n-k-1 \end{matrix}\right\rangle\) 我们可以对上述公式继续化简成 \(O(k)\) 求一个的公式,令 \(k=n-k-1\)
后面两步分别是整体加一和 \(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 的博客
主要是因为 \([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\) 路径
压缩
向上平移
卡特兰扩展-格路计数
用来优化一类转移比较简单的 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)\) 的方案数。
\(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\) 异侧,所以一定会经过。
这个东西是可以莫队的,具体的,如果 \(a\) 变化,那么×2再加上新的项即可,如果 \(b\) 变化,利用 \(\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1}\) ,利用解方程解出新的值。
该怎样解方程?
把 \(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\) , 正确性显然,但是可以用来一些 总个数/总方案 得到平均数来证明,应用比较灵活。