第一类斯特林数
第一类斯特林数一般记为\(\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\)就行了。
这几个式子感觉很好说明了第一类斯特林数、第二类斯特林数以及自然数幂和之间的关系~