定义

第二类斯特林数记作 {nk}\begin{Bmatrix}n\\ k\end{Bmatrix} 或者 S(n,k)S(n,k),其意义是将 nn 个互不相同的元素划分为 kk 个相同的非空集合的方案数。

朴素求解

{nk}={n1k1}+k×{n1k}\begin{Bmatrix}n\\ k\end{Bmatrix} =\begin{Bmatrix}n-1\\ k-1\end{Bmatrix}+k\times\begin{Bmatrix}n-1\\ k\end{Bmatrix}

如果前 n1n-1 个元素只使用了 [1,k)[1,k) 的盒子,那么第 nn 个一定要放到第 kk 个盒子里。

如果前 n1n-1 个元素用完了 [1,k][1,k] 的盒子,那么第 nn 个元素就可以随便放。

显然将两种方案加起来就是最终的方案。

容易理解上式的边界条件为 {00}=1\begin{Bmatrix}0\\ 0\end{Bmatrix}=1

通项公式

GiG_i 表示将 nn 个不同元素放入 ii 个不同盒子允许为空的方案数,FiF_i 表示将 nn 个不同的元素放入 ii 个不同盒子不允许为空的方式。

那么显然:

Gi=inG_i=i^n

同时还有:

Gi=j=0i(ij)FjG_i=\sum\limits_{j=0}^i {i\choose j} F_j

发现上面的式子和二项式反演一样,所以得到:

Fi=j=0i(1)ij×(ij)×GiF_i=\sum\limits_{j=0}^i (-1)^{i-j}\times {i\choose j}\times G_i

GG 带入并化简得到:

Fi=j=0i(1)ij×i!×inj!×(ij)!F_i=\sum\limits_{j=0}^i\dfrac{(-1)^{i-j}\times i!\times i^n}{j!\times (i-j)!}

因为斯特林数的盒子不一样,所以 FkF_k 就是就是 {nk}\begin{Bmatrix}n\\ k\end{Bmatrix}k!k! 倍,所以得到:

{nk}=Fkk!=i=0k(1)ki×ini!×(ki)!\begin{Bmatrix}n\\ k\end{Bmatrix}=\dfrac{F_k}{k!}=\sum\limits_{i=0}^k\dfrac{(-1)^{k-i}\times i^n}{i!\times (k-i)!}

因为 f(x)=xnf(x)=x^n 是积性函数,所以可以 O(n)O(n) 预处理,O(1)O(1) 求解。

应用

当题目里出现 ini^n 是可以用第二类斯特林数展开。

得到:

in=j=0nj!×(ij)×{nj}i^n=\sum\limits_{j=0}^n j!\times {i\choose j}\times \begin{Bmatrix} n\\j\end{Bmatrix}

把组合数展开然后约分得到:

in=j=0ni!(ij)!×{nj}i^n=\sum\limits_{j=0}^n \dfrac{i!}{(i-j)!}\times \begin{Bmatrix} n\\j\end{Bmatrix}