斯特林数及斯特林反演

第一类斯特林数

第一类斯特林数一般记为\(\displaystyle \begin{bmatrix} n\\k \end{bmatrix}\),组合意义将\(n\)个小球分为\(k\)个圆环的方案数。因此有递推式:

\[\begin{bmatrix} n \\ k \end{bmatrix}=\begin{bmatrix} n - 1 \\ k - 1 \end{bmatrix} + (n-1)\cdot \begin{bmatrix} n - 1 \\ k \end{bmatrix} \]

递推式也比较好理解:现在考虑放第\(n\)个小球,那么有两种情况:一种是其单独成为一个环,另一种情况是放在其余某个小球的左边/右边。两种情况加起来就是答案。

性质

  • \(\displaystyle \begin{bmatrix} n \\ 1 \end{bmatrix}=(n-1)!\)

这就相当于一个环排列。

  • \(\displaystyle n!=\sum_{i=0}^n \begin{bmatrix} n \\ i \end{bmatrix}\)

第一类斯特林数的本质是环排列的个数,而每一个环其实就相当于一个置换。那么这里相当于枚举了所有的置换,所有的置换方案数即为\(n!\)

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

这个式子数学归纳法即可证明:

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

注意一下上下界的变化,巧妙地凑出了\(\displaystyle \begin{bmatrix} n + 1 \\ i \end{bmatrix}\)

  • \(\displaystyle x^{\overline{n}}=\sum_{i=0}^n\begin{bmatrix} n \\ i \end{bmatrix}x^i\)

这个用数学归纳法同理可证。

这几个式子揭示了上、下降幂与斯特林数的联系,其中下降幂显然可以表示成排列的形式,这也说明斯特林数与排列组合之间有冥冥的联系。

预处理
有时候需要快速得到一行的第一类斯特林数的值,我们直接递推预处理的话时间复杂度较高,下面介绍一种\(O(nlogn)\)求解的方法。
显然第一类斯特林数的生成函数为:

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

之后令\(\displaystyle F_n(x)=\prod_{i=0}^{n-1}(x+i)\),那么\(\displaystyle F_{2n}(x)=F_n(x)\cdot F_n(x+n)\),接下来就又是推式子啦:

\[\begin{aligned} F_{n}(x+n)=&\prod_{i=0}^{n-1}(x+n+i)\\ =&\sum_{i=0}^n\begin{bmatrix} n \\ i \end{bmatrix}(x+n)^i\\ =&\sum_{i=0}^n \begin{bmatrix} n \\ i \end{bmatrix}\sum_{j=0}^i {i\choose j} x^jn^{i-j}\\ =&\sum_{j=0}^n\frac{x^j}{j!}\sum_{i=j}^n \begin{bmatrix} n \\ i \end{bmatrix}i!\cdot \frac{n^{i-j}}{(i-j)!} \end{aligned} \]

观察到后半部分其实是一个减法卷积的形式,那么我们在这里通过\(FFT\)即可快速求解后半部分的答案,最后乘以\(\displaystyle\frac{1}{j!}\)即可快速得到\(\displaystyle F_n(x+n)\)
那么\(\displaystyle F_n(x)\cdot F_{n}(x+n)=F_{2n}(x)\),我们再做一次乘法运算,就可以通过\(F_n(x)\)快速得到\(F_{2n}(x)\)了。

这里减法卷积的话,我们只需要将其中一个多项式翻转一下,然后将结果再翻转一下即可得到答案。

第二类斯特林数

第二类斯特林数记为\(\displaystyle \begin{Bmatrix} n \\ k \end{Bmatrix}\),表示将\(n\)个数划分为\(k\)个非空集合的方案数。
那么根据这个则有递推式:

\[\begin{Bmatrix} n \\ k \end{Bmatrix}=\begin{Bmatrix} n - 1 \\ k - 1 \end{Bmatrix}+k\begin{Bmatrix} n - 1 \\ k \end{Bmatrix} \]

也是分两种情况,稍有不同的是这里是集合,所以我们乘的是\(k\)
下面直接将第二类斯特林数记为\(\displaystyle S(n,k)\)

性质

  • \(\displaystyle S(n,k)=\frac{1}{k!}\sum_{i=0}^k(-1)^i{k\choose i}(k-i)^n\)

等式右边就是一个容斥,枚举有多少个空集合来进行容斥,当我们确定了\(i\)个空集合后,其余随便选就行。

  • \(\displaystyle n^m=\sum_{i=0}^n S(m,i)\cdot i!\cdot {n\choose i}\)

左边就相当于将\(m\)个小球放入\(n\)个盒子内,但可能存在空盒子;右边就相当于枚举有多少个非空的盒子,之后将所有情况加起来。显然两者相等。
注意一下,这里求和上界\(n,m\)都可以,不影响最终答案。

通过这个式子,我们可以用来求解自然数幂和:

\[\begin{aligned} S(n)=&\sum_{i=1}^ni^k\\ =&\sum_{i=1}^{n}\sum_{j=0}^kS(k,j)\cdot j!\cdot {i\choose j}\\ =&\sum_{j=0}^{k}S(k,j)\cdot j!\sum_{i=0}^n{i\choose j}\\ =&\sum_{j=0}^k S(k,j)\cdot j!\cdot {n + 1\choose j + 1}\\ \end{aligned} \]

这样就可以在\(O(k)\)的时间复杂度内求出答案了,跟拉格朗日插值的时间复杂度一致。

预处理
同第一类斯特林数一样,如果我们需要预处理出某一整行的第二类斯特林数的话,直接递推是很麻烦的,我们有更加快速的方法。
我们可以借助第二类斯特林数的通项来求解:

\[\begin{aligned} S(n,k)=&\frac{1}{k!}\sum_{i=0}^k(-1)^i{k\choose i}(k-i)^n\\ =&\sum_{i=0}^k\frac{(-1)^i}{i!}\cdot \frac{(k - i)^n}{(k-i)!} \end{aligned} \]

显然这就是一个普通的卷积,那么我们就可以在\(O(nlogn)\)的时间内快速求解了。

斯特林反演

如果有:

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

则有:

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

感觉跟二项式反演有点像?

证明的话需要一个叫做反转公式的东西:

\[\begin{aligned} \sum_{k=m}^{n}(-1)^{n-k}\begin{bmatrix} n \\ k \end{bmatrix}\begin{Bmatrix} k \\ m \end{Bmatrix}=[n=m]\\ \sum_{k=m}^{n}(-1)^{n-k}\begin{Bmatrix} n \\ k \end{Bmatrix}\begin{bmatrix} k \\ m \end{bmatrix}=[n=m] \end{aligned} \]

然后还需要知道上升阶乘幂和下降阶乘幂之间的关系:

\[\begin{aligned} x^{\underline{n}}=(-1)^n(-x)^{\overline{n}}\\ x^{\overline{n}}=(-1)^n(-x)^{\overline{n}} \end{aligned} \]

然后就开始推式子:

\[\begin{aligned} n^m=&\sum_{i=0}^m \begin{Bmatrix}m\\i\end{Bmatrix}\cdot i!\cdot {n\choose i}\\ =&\sum_{i=0}^{m}\begin{Bmatrix}m\\i\end{Bmatrix}n^{\underline{i}}\\ =&\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}(-1)^i(-n)^{\overline{i}}\\ =&\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}(-1)^i\sum_{j=0}^i\begin{bmatrix} i \\ j \end{bmatrix}(-n)^j\\ =&\sum_{j=0}^m n^j\sum_{i=j}^{m}\begin{Bmatrix}m\\i\end{Bmatrix}\begin{bmatrix} i \\ j \end{bmatrix}(-1)^{i-j} \end{aligned} \]

这是第二个反转公式的形式,注意最后\(-1\)的指数也可以写为\(n-i\)。我们可以分两种情况考虑:第一种\(j=m\)时显然两个都一样;第二种\(j\not ={m}\)时,后面那部分为\(0\),所以多个正负号没用。
然后我们来推第一个反转公式:

\[\begin{aligned} x^{\underline{n}}=&\sum_{i=0}^{n}(-1)^{n-i}\begin{bmatrix} n \\ i \end{bmatrix}x^i\\ =&\sum_{i=0}^{n}\begin{bmatrix} n \\ i \end{bmatrix}(-1)^{n-i}\sum_{j=0}^i{x\choose j}\begin{Bmatrix} i \\ j \end{Bmatrix}j!\\ =&\sum_{j=0}^nx^{\underline{j}}\sum_{i=j}^{n}(-1)^{n-i}\begin{bmatrix} n \\ i \end{bmatrix}\begin{Bmatrix} i \\ j \end{Bmatrix} \end{aligned} \]

显然也只有当\(j=n\)时,后半部分为\(1\)

那么我们就已经证明了反转公式了。
接下来再来证明斯特林反演:
假如有:

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

那么:

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

假如有

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

那么:

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

所以斯特林反演就证完啦。

斯特林数反演还有另外一种类似的形式:
已知

\[f_i=\sum_{j=i}^n\begin{Bmatrix} j \\ i \end{Bmatrix}g_j \]

那么

\[g_i=\sum_{j=i}^n(-1)^{j-i}\begin{bmatrix} j \\ i \end{bmatrix}f_j \]

同样通过反转公式容易得证。

最后再附上几个比较有意思的式子:

\[\begin{aligned} &x^n=\sum_{i=0}^{x}{x\choose i}i!\begin{Bmatrix} n \\ i \end{Bmatrix} =\sum_{i=0}^{x}\begin{Bmatrix} n \\ i \end{Bmatrix}n^{\underline{i}}\\ &x^n=\sum_{i=0}^x(-1)^{x-i}\begin{Bmatrix} n \\ i \end{Bmatrix}n^{\underline{i}}\\ &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 \end{aligned} \]

第二个式子的证明直接将第一个式子中的\(x\)换为\(-x\)就行了。
这几个式子感觉很好说明了第一类斯特林数、第二类斯特林数以及自然数幂和之间的关系~

posted @ 2019-12-16 20:25  heyuhhh  阅读(1069)  评论(3编辑  收藏  举报