定义
第二类斯特林数记作 {nk} 或者 S(n,k),其意义是将 n 个互不相同的元素划分为 k 个相同的非空集合的方案数。
朴素求解
{nk}={n−1k−1}+k×{n−1k}
如果前 n−1 个元素只使用了 [1,k) 的盒子,那么第 n 个一定要放到第 k 个盒子里。
如果前 n−1 个元素用完了 [1,k] 的盒子,那么第 n 个元素就可以随便放。
显然将两种方案加起来就是最终的方案。
容易理解上式的边界条件为 {00}=1。
通项公式
设 Gi 表示将 n 个不同元素放入 i 个不同盒子允许为空的方案数,Fi 表示将 n 个不同的元素放入 i 个不同盒子不允许为空的方式。
那么显然:
Gi=in
同时还有:
Gi=j=0∑i(ji)Fj
发现上面的式子和二项式反演一样,所以得到:
Fi=j=0∑i(−1)i−j×(ji)×Gi
将 G 带入并化简得到:
Fi=j=0∑ij!×(i−j)!(−1)i−j×i!×in
因为斯特林数的盒子不一样,所以 Fk 就是就是 {nk} 的 k! 倍,所以得到:
{nk}=k!Fk=i=0∑ki!×(k−i)!(−1)k−i×in
因为 f(x)=xn 是积性函数,所以可以 O(n) 预处理,O(1) 求解。
应用
当题目里出现 in 是可以用第二类斯特林数展开。
得到:
in=j=0∑nj!×(ji)×{nj}
把组合数展开然后约分得到:
in=j=0∑n(i−j)!i!×{nj}