斯特林数与斯特林反演
我们熟知一个度数为 \(D\) 的多项式有三种经典表示:
-
系数表示,也就是 \(P(x) = \sum_{i=0}^D\limits c_i x^i\)。
-
点值表示,也即给出 \(P\) 在 \(D+1\) 个不同的位置的取值 \((x_0, P(x_0)), \dots, (x_D, P(x_D))\).
-
下降幂表示,也即定义 \(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),设:
其中 \(s(i,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\)
定理:对任意 \(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^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-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{n}} = \sum_{i=0}^n\limits b_i x^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_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\) 个非空集合的方案数。
我们注意到第二类斯特林数满足递推:
考虑第 \(n\) 个元素,如果它单独作为一个集合,方案数为 \(S(n-1, m-1)\)
如果把前 \(n-1\) 个元素划分成 \(m\) 个非空集合,然后把第 \(n\) 个元素插入到某个集合中,方案数为 \(m \cdot S(n - 1, m)\)
二者加和即可
现在回到多项式表示的转化问题上。为了从系数表示转化为下降幂表示,我们有:
我们用 \(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}}\),化简就可以得到
这个式子给出了用上升幂表示通常幂的公式。
第二类斯特林数的容斥公式
定理: 对任意 \(n,m\ge 0\),以下公式成立.
这个公式可以用容斥原理证明
回忆 \(S(n,m)\) 表示把 \(n\) 个元素划分成 \(m\) 个非空组的方案数。
因此 \(S(n,m)\cdot m!\) 为把 \(n\) 个不同的小球扔进 \(m\) 个可以区分的框并要求每个框非空的方案数。
忽略非空的要求,我们有 \(m^n\) 种方法来把小球扔进框,为了减掉不合法的方案,我们使用容斥原理枚举至少有某 \(k\) 个盒子为空的情形,计算对应的方案数并配上容斥系数即可。
进一步地,固定 \(n\ge 1\),我们发现
是一个卷积的形式。因此可以在 \(O(m\log m)\) 的时间内求出第 \(n\) 行的前 \(m\) 个斯特林数。
第二类斯特林数的生成函数
全体非空集合的生成函数为 \(e^z -1\),给定 \(m\ge 1\), \(\frac{(e^z-1)^m}{m!}\) 就给出了把 \(n\) 个元素划分 \(m\) 个非空集合的方案数。注意到这恰好是 \(S(n, m)\) 的指数生成函数,即
固定 \(m\),使用分治FFT(或者多项式求 exp)可以在 \(O(n\log(nm))\) 的时间内计算出一列斯特林数 \((S(i,m))_{i=0}^n\).
注. 我们也注意到通过生成函数可以给前述容斥公式一个新的证明:
两类斯特林数的反演公式
考虑通常幂与下降幂之间的转化公式:
把第二行代入到第一行,有:
进而可得斯特林反演公式:
应用:
假设 \((f_i)\) 和 \((g_i)\) 是两个数列,如果:
那么:
连通图的计数:
作为一种特殊情形,我们考虑第一个公式在 \(j=1\) 时的情形。由于 \(s(j,1)=(j-1)! \cdot (-1)^{j-1}\),我们得到
由于这个公式频繁出现在一类关于等价类计数的问题,因而有必要对其特别注意和练习。
我们可以用图连通性的语言来描述这一类问题:考虑一族 \(n\) 个点的带标号无向图 \(\mathcal{G} = \{G:G = ([n],E)\}\) (例如,\(\mathcal{G}\) 包含所有 \(\frac{n^2}{10}\) 条边的简单无向图),而我们想计算 \(\mathcal{G}\) 中有多少个图是连通的。
对此类问题,一种基于斯特林反演(容斥)做计数的思路是这样的:我们令 \(c(G)\) 表示图 \(G\) 的连通块个数,那么就有
在一些问题里,我们可以通过组合意义来理解和实现等式右边的式子,从而做高效计数。在斯特林数的专题训练中,我们会以具体的例子来阐述上述公式的应用。