斯特林数 学习笔记

一份简要的斯特林数学习笔记. 从原博客迁移而来.

第二类斯特林数(斯特林子集数)

\(\begin{Bmatrix}n \\ k\end{Bmatrix}\),表示将 \(n\) 个两两不同的元素,划分为 \(k\) 个互不区分的非空集合的方案数。

有递推式 \(\begin{Bmatrix}n \\ k\end{Bmatrix}=k\cdot \begin{Bmatrix}n-1 \\ k\end{Bmatrix}+\begin{Bmatrix}n-1 \\ k-1\end{Bmatrix},\begin{Bmatrix}n \\ 0\end{Bmatrix}=[n=0]\)

同时还有通项公式

\[ \begin{Bmatrix}n \\ k\end{Bmatrix}=\sum_{i=0}^k\dfrac{(-1)^{k-i}i^n}{(k-i)!i!} \]

证明:

考虑这样一个问题:将 \(n\) 个物品涂成 \(k\) 种颜色,我们用两种方法计算它的方案数:

\[ k^n=\sum_{i=0}^k\binom{k}{i}\begin{Bmatrix}n \\ i\end{Bmatrix}i! \]

左边是显然的。右边是枚举用几种颜色涂。(注意到第二类斯特林数不允许空集)

做一个二项式反演,得到

\[ \begin{Bmatrix}n \\ k\end{Bmatrix}k!=\sum_{i=0}^k(-1)^{k-i}\binom{k}{i}i^n \]

稍加整理就能得到结论。

第一类斯特林数(斯特林轮换数)

\(\begin{bmatrix}n \\ k\end{bmatrix}\),将 \(n\) 个两两不同的元素,划分为 \(k\) 个互不区分的非空轮换的方案数。

有递推式 \(\begin{bmatrix}n \\ k\end{bmatrix}=(n-1)\begin{bmatrix}n-1 \\ k\end{bmatrix}+\begin{bmatrix}n-1 \\ k-1\end{bmatrix},\begin{bmatrix}n \\ 0\end{bmatrix}=[n=0]\)

它没有实用的通项公式。

斯特林数的计算

显然,两种斯特林数都可以 \(O(nk)\) 求。

第二类斯特林数 · 行

根据通项公式

\[ \begin{Bmatrix}n \\ k\end{Bmatrix}=\sum_{i=0}^n\dfrac{(-1)^{k-i}i^n}{(k-i)!i!} \]

于是设 \(f_n=\sum_{k\ge 0}\begin{Bmatrix}n \\ k\end{Bmatrix}x^k,g_n=\sum_{k\ge 0}\dfrac{i^n}{i!}x^k\),则 \(f_n=e^{-x}*g_n\)

第二类斯特林数 · 列

先考虑把相同的集合变成不同的非空盒子,则最后答案需要除以 \(k!\)

设一个非空盒子的 EGF(以物品数量为组合对象)为 \(G(x)\)\(k\) 个非空盒子的 EGF 为 \(F(x)\)。故有

\[ G(x)=\sum_{i\ge 1} \dfrac{x^i}{i}=e^x-1,F(x)=G^k(x) \]

于是有

\[ \sum_{i\ge 0}\begin{Bmatrix}i \\ k\end{Bmatrix}\dfrac{x^i}{i!}=\dfrac{(e^x-1)^k}{k!} \]

直接多项式快速幂计算。

第一类斯特林数 · 行

\(f_n(x)=\sum_{i\ge 0}\begin{bmatrix}n \\ k\end{bmatrix}x^i\),由递推式得到

\[ f_{n+1}(x)=(x+n)f_n(x) \]

得到

\[ f_n(x)=\prod_{i=0}^{n-1}(x+i)=x^{\overline n} \]

我们的任务转化为计算上升幂。可以通过分治 FFT 以 \(O(n\log^2n)\) 完成。

但是,也可以如下计算:

考虑倍增,\(f_{2n}(x)=x^{\overline{2n}}=x^{\overline {n}}(x+n)^{\overline{n}}=f_n(x)f_n(x+n)\)

下面为了方便表述,设 \(f_n(x)=\sum_{i\ge 0}a_ix^i\)

\[ \begin{aligned} f_n(x+n)=&\sum_{i=0}^na_i(x+n)^i \\=&\sum_{i=0}^na_i\sum_{j=0}^i\binom{i}{j}x^jn^{i-j} \\=&\sum_{j= 0}^n\dfrac{x^j}{j!}\sum_{i = j}^n\dfrac{n^{i-j}}{(i-j)!}a_ii! \end{aligned} \]

\(A_i=a_ii!,B_i=\dfrac{n^i}{i!}\)

\[ \begin{aligned} f_n(x+n)=&\sum_{j=0}^n\dfrac{x^j}{j!}\sum_{i=j}^nA(i)B(i-j) \\=&\sum_{j=0}^n\dfrac{x^j}{j!} \sum_{i=0}^{n-j}A(i+j)B(i) \end{aligned} \]

后面那部分显然可以卷积,于是再做个和、除以 \(j!\) 就可以得到 \(f_n(x+n)\)

总复杂度 \(O(n\log n)\)

第一类斯特林数 · 列

先写出单个轮换的EGF:

\[ f(x)=\sum_{i\ge 1}(i-1)!\dfrac{x^i}{i!}=\sum_{i\ge 1}\dfrac{x^i}{i}=\ln\dfrac{1}{1-x} \]

于是,\(k\) 个轮换的 EGF 即为

\[ \dfrac{f^k(x)}{k!} \]

做多项式快速幂即可。

阶乘幂与方幂的转化

根据上面第一类斯特林数的性质,有

\[ x^{\overline{n}}=\sum_{i=0}^n\begin{bmatrix} n \\ i\end{bmatrix}x^i \]

利用有符号第一类斯特林数,用类似的推导方法可以得到

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

我们再看看怎么转化回去:

\[ x^n=\sum_{i=0}^n\begin{Bmatrix}n \\ i\end{Bmatrix}\binom{x}{i} i! \]

\(\binom{x}{i}i!=x^{\underline i}\)

于是

\[ x^n=\sum_{i=0}^n\begin{Bmatrix}n \\ i\end{Bmatrix}x^{\underline i} \]

同样有方幂转上升幂

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

这两个有符号斯特林数推出的式子,可以直接用上升幂和下降幂的相似性得到(它们展开后仅差一些负号)。

当然,这四个式子都可以数学归纳证明。

如何记忆呢?

将阶乘幂转化为方幂,使用第一类斯特林数(它的 OGF 决定了这一点);

将方幂转化为阶乘幂,使用第二类斯特林数(它的 组合意义 决定了这一点)。

那么,什么时候添加 \((-1)^{n-i}\)?显然有 \(x^{\overline{n}}\ge x^n \ge x^{\underline{n}}\),当将大的幂转化为小的幂的时候,需要添加负号。

斯特林反演

\[ g(n)=\sum_{i=0}^n\begin{Bmatrix}n \\ i\end{Bmatrix}f(i) \]

\[ f(n)=\sum_{i=0}^n(-1)^{n-i}\begin{Bmatrix}n \\ i\end{Bmatrix}g(i) \]

当然,把第一类和第二类反过来也对;根据反演的一般套路,改为枚举 \(j\ge i\) 也对。