斯特林数与斯特林反演

我们熟知一个度数为 \(D\) 的多项式有三种经典表示:

  1. 系数表示,也就是 \(P(x) = \sum_{i=0}^D\limits c_i x^i\)

  2. 点值表示,也即给出 \(P\)\(D+1\) 个不同的位置的取值 \((x_0, P(x_0)), \dots, (x_D, P(x_D))\).

  3. 下降幂表示,也即定义 \(x^{\underline{i}} = x(x-1)\dots (x-i+1)\),那么可以把 \(P\) 写为 \(P(x) = \sum_{i=0}^D\limits b_i x^{\underline{i}}\).

(1) 和 (2) 相互转化可以使用多项式的多点求值和快速插值。

我们也可以借助二项式反演和 \(FFT\),以 \(O(D\log D)\) 的时间在 (2) 和 (3) 之间转化。

\[\]

第一类斯特林数


有符号第一类斯特林数

定义: 对任意 \(i,j\ge 0\),定义 \(s(i,j)\)\(x^{\underline{i}}\) 展开之后 \(x^j\) 一项的系数。

考虑从 (3) 直接转化为 (1),设:

\[x^{\underline{i}} = x (x-1)\dots (x-i+1) = \sum_{j=0}^i s(i,j)\cdot x^j, \]

其中 \(s(i,j)\) 是我们希望求出的系数,有递推式:

\[s(i,j) = [x^j]x^{\underline{i}} = [x^j] (x^{\underline{i-1}}\cdot (x-(i-1)))\\ = s(i-1,j-1) - (i-1)\cdot s(i-1,j) \]

时间复杂度为 \(O(n^2)\)

得到 \(s(\star, \star)\) 之后,我们可以在 \(O(n^2)\) 的时间内完成由 (1) 和 (3) 之间的相互转化。

这里的 \(s(i,j)\) 就是(有符号)第一类斯特林数。

无符号第一类斯特林数

定义: 对任意 \(i,j\ge 0\),定义 \(s_u(i,j)\)\(x^{\overline{i}}\) 展开后 \(x_j\) 一项的系数。

类似地,考虑上升幂 \(x^{\overline{i}}=x(x+1)\dots (x+i-1)\)

展开后得到的的多项式 \(x^{\overline{i}} = \sum_{j=0}^{i}\limits s_u(i,j) x^j\)

\[s_u(i,j)=[x^j]x^{\overline{i}}=[x^j](x^{\overline{i-1}}\cdot(x+i-1)) \\ =s(i-1,j-1)+(i-1)\cdot s(i-1,j) \]

定理:对任意 \(i,j\ge 0\),有 \(s_u(i,j)\ge 0\), \(s(i,j) = s_u(i,j) \cdot (-1)^{i-j}\)

归纳可得 \(s_u(i,j)\ge 0\),下证 \(s(i,j) = s_u(i,j) \cdot (-1)^{i-j}\)

考虑:

\[x^{\underline{i}}=\prod_{j=0}^{i-1}(x-j)=\sum_{j=0}^{i}\limits s(i,j) x^j \\ x^{\overline{i}}=\prod_{j=0}^{i}(x+j) =\sum_{j=0}^{i-1}\limits s_u(i,j) x^j \]

可以看出, \([x^j]x^{\overline{i}}\)\([0,i]\) 中任意 \(i-j\) 个数之积的和

\([x^j]x^{\overline{i}}\)\([-i,0]\) 中任意 \(i-j\) 个数之积的和

其绝对值相等,\(s_u(i,j)\ge 0\)\(s(i,j)\) 的正负性与 \(i-j\) 的奇偶性相同

证毕

第一类斯特林数的组合意义

无符号第一类斯特林数具有如下组合意义:

\(s(i,j)\) 表示把 \(i\) 个元素划分成 \(j\) 个非空圆排列的方案数

考虑它的通项公式:

\[s(i,j)=s(i-1,j-1)+(i-1)*s(i-1,j) \]

有如下理解:

考虑新元素放在哪里,有两种选择 —— 单独形成一组,方案数为 \(s(i-1,j-1)\) 、放在某两个元素的中间,方案数为 \(s(i-1,j)\)

因此,该公式具有如上组合意义

第一类斯特林数的计算

递推

按照递推式,可以在 \(O(n^2)\) 时间内计算出 \(s_u(\le n,\le n)\)

一行中的斯特林数

固定 \(n\le 10^5\),计算 \(s_u(n,\star)\)

这相当于求 \(x^{\overline{n}}\) 的系数表达.

可以使用倍增,假设已经计算出 \(x^{\overline{n}}\) 的系数表达,那么

\[x^{\overline{2n}} = x^{\overline{n}} \cdot (x+n)^{\overline{n}}. \]

\(x^{\overline{n}} = \sum_{i=0}^n\limits b_i x^i\),我们注意到

\[[x^i](x+n)^{\overline{n}} = [x^i]\sum_{j=0}^{n} b_j (x+n)^j \\ =\sum_{j=i}^n \binom{j}{i} b_j n^{j-i} \\ =\sum_{j=i}^n \frac{j!}{i!(j-i)!} b_j n^{j-i} \]

令:

\[F(x)=\sum_{j=0}^{n}b_j\cdot j! \cdot x^j \\ G(x)=\sum_{j-i=0}^{n}\frac{n^{j-i}}{(j-i)!}x^{j-i} \]

\(F\),与 \(G\) 做减法卷积即可得到 \((x+n)^{\overline{n}}\),时间复杂度 \(O(n\log n)\)

得到 \((x+n)^{\overline{n}}\) 后可以通过一次 FFT 计算出 \(x^{\overline{2n}}\),时间复杂度为 \(O(n\log n)\)

综上,我们可以通过倍增 + FFT在 \(T(n)=T(\frac{n}{2})+O(n \log n)=O(n \log n)\) 的时间内计算出 \(s_u(n,\star)\).

一列中的斯特林数

固定 \(d\le 10^5\),对任意的 \(n\le 2\times 10^5\) 计算 \(s_u(n,d)\)

此时我们应该考虑第一类斯特林数的组合意义:

\(n\) 个元素划分成 \(d\) 个圆牌列的方案数

我们定义

\[F(x) = \sum_{i=1}^{\infty}\frac{(i-1)!}{i!}x^i = \sum_{i=1}^{\infty} \frac{f_i}{i!} x^i. \]

这里 \(f_i\) 为把 \(i\) 个元素排成一个圆牌列的方案数,而 \(F(x)\)\((f_i)_{i\ge 1}\) 的指数型生成函数

注意到 \([x^i]F(x)^d\) 即为把 \(i\) 个元素划分成 \(d\) 个圆牌列的方案数

使用生成函数的 ln / exp 或者倍增来计算生成函数的 \(d\) 次幂。

注. 不难发现 \(F(x) =\sum_{i\ge 1}\limits \frac{x^i}{i} = -\ln(1-x)\).

第二类斯特林数

定义:对任意 \(n,m\ge 0\),第二类斯特林数 \(S(n, m)\) 定义为把 \(n\) 个不同的元素划分成 \(m\) 个非空集合的方案数。

我们注意到第二类斯特林数满足递推:

\[S(n,m) = S(n - 1, m-1) + m \cdot S(n - 1, m). \]

考虑第 \(n\) 个元素,如果它单独作为一个集合,方案数为 \(S(n-1, m-1)\)

如果把前 \(n-1\) 个元素划分成 \(m\) 个非空集合,然后把第 \(n\) 个元素插入到某个集合中,方案数为 \(m \cdot S(n - 1, m)\)

二者加和即可

现在回到多项式表示的转化问题上。为了从系数表示转化为下降幂表示,我们有:

\[x^i = \sum_{j=0}^i S(i, j) x^{\underline{j}}. \]

我们用 \(x^i\) 表示将 \(i\) 个可以区分的小球扔进 \(x\) 个框的方案数

枚举有 \(j\le i\) 个框非空,先把 \(i\) 个小球分成非空的 \(j\) 组,接着从 \(x\) 个框里按顺序挑出 \(j\) 个框来依次装这 \(j\) 组小球

这样我们就有 \(S(i, j)\cdot x^{\underline{j}}\) 种方案来把 \(i\) 个小球扔进 \(j\) 个框,因此上述公式在 \(x\) 为非负整数时成立

由于等式两边都是度数为 \(i\) 的多项式,且他们在无穷多个点上取值相同,它们只能是同一个多项式,因此上式对于一般的 \(x\in \mathbb{R}\) 都成立。

对于一个正整数 \(x\in \mathbb{N}\),我们把 \(-x\) 代入上式可得 \((-x)^i = \sum_{j=0}^i S(i,j) (-x)^{\underline{j}}\)。注意到 \((-x)^{\underline{j}}=(-1)^j\cdot x^{\overline{j}}\),化简就可以得到

\[x^i = \sum_{k=0}^i (-1)^{i-j} \cdot S(i,j)\cdot x^{\overline{i}}, \]

这个式子给出了用上升幂表示通常幂的公式。

第二类斯特林数的容斥公式

定理: 对任意 \(n,m\ge 0\),以下公式成立.

\[S(n,m) = \frac{1}{m!} \sum_{k=0}^m (-1)^k \binom{m}{k} (m - k)^n. \]

这个公式可以用容斥原理证明

回忆 \(S(n,m)\) 表示把 \(n\) 个元素划分成 \(m\) 个非空组的方案数。

因此 \(S(n,m)\cdot m!\) 为把 \(n\) 个不同的小球扔进 \(m\) 个可以区分的框并要求每个框非空的方案数。

忽略非空的要求,我们有 \(m^n\) 种方法来把小球扔进框,为了减掉不合法的方案,我们使用容斥原理枚举至少有某 \(k\) 个盒子为空的情形,计算对应的方案数并配上容斥系数即可。

进一步地,固定 \(n\ge 1\),我们发现

\[S(n, m) = \sum_{k=0}^m \frac{(-1)^{k}}{k!} \cdot \frac{(m-k)^n}{(m-k)!} \]

是一个卷积的形式。因此可以在 \(O(m\log m)\) 的时间内求出第 \(n\) 行的前 \(m\) 个斯特林数。

第二类斯特林数的生成函数

全体非空集合的生成函数为 \(e^z -1\),给定 \(m\ge 1\), \(\frac{(e^z-1)^m}{m!}\) 就给出了把 \(n\) 个元素划分 \(m\) 个非空集合的方案数。注意到这恰好是 \(S(n, m)\) 的指数生成函数,即

\[\sum_{n\ge 0} \frac{S(n,m)}{n!} z^n = \frac{(e^z - 1)^m}{m!}. \]

固定 \(m\),使用分治FFT(或者多项式求 exp)可以在 \(O(n\log(nm))\) 的时间内计算出一列斯特林数 \((S(i,m))_{i=0}^n\).

注. 我们也注意到通过生成函数可以给前述容斥公式一个新的证明:

\[\begin{aligned} \frac{S(n, m)}{n!} &= [z^n]\frac{(e^z-1)^m}{m!} \\ &= [z^n]\frac{1}{m!}\sum_{i=0}^m \binom{m}{i} (-1)^{n-i} e^{iz}\\ &= \frac{1}{n!}\cdot \frac{1}{m!}\sum_{i=0}^m \binom{m}{i} i^n (-1)^{n-i}. \end{aligned} \]

两类斯特林数的反演公式

考虑通常幂与下降幂之间的转化公式:

\[x^i=\sum_{j=0}^{i}s(i,j) \cdot x^{\underline{j}} \\ x^{\underline{i}}=\sum_{j=0}^{i}S(i,j) \cdot x^j \]

把第二行代入到第一行,有:

\[x^i=\sum_{j=0}^{i}s(i,j) \cdot \sum_{t=0}^{j}S(j,t) \cdot x^t \\ x^i=\sum_{j=0}^{i}\sum_{t=0}^{j} s(i,j) \cdot S(j,t) \cdot x^t \\ x^i=\sum_{j=0}^{t}x^j\sum_{t=j}^{i} s(i,t) \cdot S(t,j) \]

进而可得斯特林反演公式:

\[\sum_{t=j}^{i} s(i,t) \cdot S(t,j) =[i==j] \\ \sum_{t=j}^{i} S(i,t) \cdot s(t,j) =[i==j] \]

应用:

假设 \((f_i)\)\((g_i)\) 是两个数列,如果:

\[f_i = \sum_{j\le i} S(i,j)\cdot g_j. \]

那么:

\[g_i =\sum_{j\le i} s(i, j)\cdot f_j. \]

连通图的计数:

作为一种特殊情形,我们考虑第一个公式在 \(j=1\) 时的情形。由于 \(s(j,1)=(j-1)! \cdot (-1)^{j-1}\),我们得到

\[\sum_{j=1}^i S(i, j)\cdot (j-1)! \cdot (-1)^{j-1} = [i = 1]. \]

由于这个公式频繁出现在一类关于等价类计数的问题,因而有必要对其特别注意和练习。

我们可以用图连通性的语言来描述这一类问题:考虑一族 \(n\) 个点的带标号无向图 \(\mathcal{G} = \{G:G = ([n],E)\}\) (例如,\(\mathcal{G}\) 包含所有 \(\frac{n^2}{10}\) 条边的简单无向图),而我们想计算 \(\mathcal{G}\) 中有多少个图是连通的。

对此类问题,一种基于斯特林反演(容斥)做计数的思路是这样的:我们令 \(c(G)\) 表示图 \(G\) 的连通块个数,那么就有

\[ANS = \sum_{G\in \mathcal{G}} [c(G) = 1] = \sum_{G\in \mathcal{G}} \sum_{j=0}^n S(c(G), j) \cdot (j-1)! \cdot (-1)^{j-1}. \]

在一些问题里,我们可以通过组合意义来理解和实现等式右边的式子,从而做高效计数。在斯特林数的专题训练中,我们会以具体的例子来阐述上述公式的应用。

posted @ 2021-12-20 15:25  一粒夸克  阅读(126)  评论(0编辑  收藏  举报