斯特林数 学习笔记
斯特林数
第一类斯特林数
第一类斯特林数 \(\begin{bmatrix}n\\m\end{bmatrix}\) 表示将 \(n\) 个有标号元素划分成 \(m\) 个无标号圆排列的方案数。
递推式
考虑每次新加入一个元素,它可以单独成为一个环,或者接到任意一个元素后面,有:
恒等式
- \(\sum\limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}=n!\),众所周知排列由若干个圆排列构成。
- \(x^{\overline{n}}=\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}x^i\),上升幂转普通幂公式,这同时指出一行第一类斯特林数的 OGF 为 \(x^{\overline{n}}\)。
生成函数
从组合意义的角度推导第一类斯特林数的生成函数 \(F(x)=\sum\limits_{i\geq 0}\sum\limits_{j\geq 0}\dfrac{x^i}{i!}y^j\begin{bmatrix}i\\j\end{bmatrix}\),注意 \(x\) 这一维上是 EGF。
首先,单个环的生成函数是 \(y\sum\limits_{i=1}^n(i-1)!\dfrac{x^i}{i!}=-y\ln(1-x)\),多个无标号环的组合就是 \(\exp(-y\ln(1-x))=(1-x)^{-y}\)。
求一行第一类斯特林数
一行第一类斯特林数的生成函数为 \(x^{\overline{n}}\),考虑如何快速求出 \(x^{\overline{n}}\),可以分治 FFT 得到一个 \(\mathcal{O}(n\log^2 n)\) 算法,下面介绍一种 \(\mathcal{O}(n\log n)\) 的算法。
仍然考虑和分治类似的思路:倍增。考虑设 \(F_i(x)=x^{\overline{n}}\),问题有两个:
- 根据 \(F_i(x)\) 得到 \(F_{2i}(x)\),发现 \(F_{2i}(x)=F_{i}(x)F_{i}(x+i)\),利用多项式平移做到 \(\mathcal{O}(n\log n)\)。
- 根据 \(F_{i}(x)\) 得到 \(F_{i+1}(x)\),暴力卷上一项是线性的。
事实证明,倍增在求多项式幂上是比分治更为优秀的结构。
求一列第一类斯特林数
考虑生成函数,有 \([y^m]\exp(-y\ln(1-x))=\dfrac{(-\ln(1-x))^m}{m!}\),使用多项式快速幂可以做到 \(\mathcal{O}(n\log n)\)。
cmd 提到了一种小常数做法,但是不想学。不过 \(\prod\limits_{i=1}^n(1-ix)\) 是 \(\prod\limits_{i=1}^n(x-i)\) 的翻转,把 DP 式子写出来转化一下定义就可以发现了。
第二类斯特林数
第二类斯特林数 \(\begin{Bmatrix}n\\m\end{Bmatrix}\) 表示将 \(n\) 个有标号元素划分成 \(m\) 个非空无标号集合的方案数。
递推式
考虑每个元素,要么加入前面的一个集合,要么新建一个集合,有:
对比第一类斯特林数的递推式,不同的只有后面一项的系数。
恒等式
- \(x^{n}=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}x^{\underline{i}}\),普通幂转下降幂公式。
- \(\begin{Bmatrix}n\\m\end{Bmatrix}m!=\sum\limits_{i=0}^m\dbinom{m}{i}(-1)^{m-i}i^n\),通项公式。可以利用容斥解释,也可以对上面二项式反演。
生成函数
从组合意义的角度推导第二类斯特林数的生成函数 \(F(x)=\sum\limits_{i\geq 0}\sum\limits_{j\geq 0}\dfrac{x^i}{i!}y^j\begin{Bmatrix}i\\j\end{Bmatrix}\),注意 \(x\) 这一维上是 EGF。
考虑单个集合的生成函数为 \(y(e^x-1)\),多个集合就是 \(\exp(y(e^x-1))\)。
求一行第二类斯特林数
通项公式就是卷积形式。
求一列第二类斯特林数
考虑 \([y^m]\exp(y(e^x-1))=\dfrac{(e^x-1)^m}{m!}\),使用多项式快速幂即可。
斯特林反演
有斯特林反演公式:
因为题目太少了,目前只知道可以钦定一些元素在一些等价类中,然后容斥。
上述式子也指出了下降幂转普通幂和普通幂转上升幂的公式:
没做过题,不会用。
习题
CF960G
考虑只有前缀最大值的限制怎么做,考虑一个 DP。设 \(f_{i,j}\) 表示前 \(i\) 个有 \(j\) 个最大值的方案数:
这就是第一类斯特林数,所以有 \(a\) 个前缀最大值方案数是 \(\begin{bmatrix}n\\a\end{bmatrix}\)。
考虑原问题。发现前缀最大值和后缀最大值之间相互独立,枚举最大值位置:
组合意义不难证明。
但是发现第一类斯特林数没有通项公式,所以只能写多项式。