斯特林数 学习笔记

斯特林数

第一类斯特林数

第一类斯特林数 \(\begin{bmatrix}n\\m\end{bmatrix}\) 表示将 \(n\) 个有标号元素划分成 \(m\) 个无标号圆排列的方案数。

递推式

考虑每次新加入一个元素,它可以单独成为一个环,或者接到任意一个元素后面,有:

\[{n\brack m}={n-1\brack m-1}+(n-1){n-1\brack 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\) 个非空无标号集合的方案数。

递推式

考虑每个元素,要么加入前面的一个集合,要么新建一个集合,有:

\[{n\brace m}={n-1\brace m-1}+m{n-1\brace 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!}\),使用多项式快速幂即可。

斯特林反演

有斯特林反演公式:

\[f_n=\sum_{i=0}^n{n\brack i}g_i\Leftrightarrow g_n=\sum_{i=0}^n{n\brace i}(-1)^{n-i}f_i \]

因为题目太少了,目前只知道可以钦定一些元素在一些等价类中,然后容斥。

上述式子也指出了下降幂转普通幂和普通幂转上升幂的公式:

\[x^{\underline{n}}=\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}(-1)^{n-i}x^i\\ x^{n}=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}(-1)^{n-i}x^{\overline{i}} \]

没做过题,不会用。

习题

CF960G

考虑只有前缀最大值的限制怎么做,考虑一个 DP。设 \(f_{i,j}\) 表示前 \(i\) 个有 \(j\) 个最大值的方案数:

\[f_{i,j}=f_{i-1,j-1}+jf_{i-1,j} \]

这就是第一类斯特林数,所以有 \(a\) 个前缀最大值方案数是 \(\begin{bmatrix}n\\a\end{bmatrix}\)

考虑原问题。发现前缀最大值和后缀最大值之间相互独立,枚举最大值位置:

\[\sum_{i=1}^n\begin{bmatrix}i-1\\a-1\end{bmatrix}\begin{bmatrix}n-i\\b-1\end{bmatrix}\binom{n-1}{i-1}=\binom{a+b-2}{a-1}\begin{bmatrix}n-1\\a+b-2\end{bmatrix} \]

组合意义不难证明。

但是发现第一类斯特林数没有通项公式,所以只能写多项式。

posted @ 2023-01-07 21:57  yllcm  阅读(67)  评论(0编辑  收藏  举报