第二类斯特林数
s 2 n m s2_n^m s2nm表示将 n n n个数放进 m m m个集合的方案数。
有一个显然的递推式:
s 2 n m = s 2 n − 1 m − 1 + m ∗ s 2 n − 1 m s2_n^m=s2_{n-1}^{m-1}+m*s2_{n-1}^m s2nm=s2n−1m−1+m∗s2n−1m,对应的意义:要么第 n n n个单独构成一个新的集合,要么放在之前某个集合中。
然而第二类斯特林数并没有什么生成函数。
但它可以花 O ( n l o g n ) O(nlogn) O(nlogn)的时间预处理出来。
我们考虑用容斥原理来推第二类斯特林数的通项公式,假设现在求 s 2 i j s2_i^j s2ij强制枚举 k k k个集合为空来计算贡献。
于是 s 2 i j = ∑ k = 0 j C j k ( j − k ) i ( − 1 ) k j ! s2_i^j=\frac{\sum_{k=0}^jC_j^k(j-k)^i(-1)^k}{j!} s2ij=j!∑k=0jCjk(j−k)i(−1)k
然后整理一下右边变成 ∑ k = 0 j ( − 1 ) k k ! ( j − k ) i ( j − k ) ! \sum_{k=0}^j\frac{(-1)^k}{k!}\frac{(j-k)^i}{(j-k)!} ∑k=0jk!(−1)k(j−k)!(