斯特林数这个东西,好像小学时就看过,当时水平很低,根本不会。
以前也遇到过一道第二类斯特林数的题,当时直接copy题解的,也不会运用。
最近遇到了自然数幂和,递推法很大的局限,只能学学第一类斯特林数。
斯特林数有第一类斯特林数和第二类斯特林数。
第一类斯特林数也分无符号和有符号,分别记为 su s u 、 ss s s 。
第二类斯特林数记为 S S .
第一类斯特林数组合含义(因为是组合,所以是无符号的):
snm s m n 表示将n个不同元素组成m个圆的方案数,圆的次序不考虑,当然圆不能为空。
第二类斯特林数含义:
Snm S m n 表示将n个不同元素放进m个集合里,与第一类斯特林数唯一的不同的在于它不考虑元素在集合里的次序,集合之间的次序也是不考虑的,集合不能为空。
在这里废话一下,和放球问题对比下。
放球问题指的是将n个无差异的球放进m个盒子里的方案数,盒子非空或不非空是可以控制的。
snm=sn−1m−1+(n−1)∗sn−1m s m n = s m − 1 n − 1 + ( n − 1 ) ∗ s m n − 1
理解:
1.把第n个球单独放进新开的第m个圆中,为 sn−1m−1 s m − 1 n − 1 。
2.把第n个球放到前面的n - 1个球的任意一个的左边,为 (n−1)∗sn−1m ( n − 1 ) ∗ s m n − 1
加起来即可。
性质:
s00=1 s 0 0 = 1
sn0=0(n>0) s 0 n = 0 ( n > 0 )
snn=1 s n n = 1
snn−1=(n−1)! s n − 1 n = ( n − 1 ) !
…
性质:
su s u nm=xn↑[xm] m n = x n ↑ [ x m ]
sv s v nm=xn↓[xm] m n = x n ↓ [ x m ]
xn↑=x∗(x+1)∗…∗(x+n−1) x n ↑ = x ∗ ( x + 1 ) ∗ … ∗ ( x + n − 1 )
xn↓=x∗(x−1)∗…∗(x−n+1) x n ↓ = x ∗ ( x − 1 ) ∗ … ∗ ( x − n + 1 )
在展开 xn↑ x n ↑ 和 xn↓ x n ↓ 的背包过程中,你发现和第一类斯特林数的方程一样,由此可以粗略证明。
所以写个 O(n log2n) O ( n l o g 2 n ) 的分治NTT就可以快速算了。
据说还有 O(n log n) O ( n l o g n ) 的算法……
Snm=Sn−1m−1+m∗Sn−1m S m n = S m − 1 n − 1 + m ∗ S m n − 1
理解:
1.将第n个球单独放进新开的第m个集合中,为 Sn−1m−1 S m − 1 n − 1 。
2.将第n个放进已开的m个集合中的任意一个集合中,为 m∗Sn−1m m ∗ S m n − 1 。
同理加起来。
性质:
S00=1 S 0 0 = 1
Sn0=0(n>0) S 0 n = 0 ( n > 0 )
Snn=1 S n n = 1
Snn−2=2n−1−1 S n − 2 n = 2 n − 1 − 1
…
考虑利用二项式反演去解决这个问题(至少至多都可以解决)。
现在要求 Sn,m S n , m 。
先不考虑无序,最后乘上 1m! 1 m ! 即可。
设 fi f i 表示恰好放到i个集合的方案数, gi g i 表示至多放到i个集合的的方案数。
显然 g(k)=kn g ( k ) = k n
f(m)=∑mi=1(−1)m−i∗Cim∗g(i) f ( m ) = ∑ i = 1 m ( − 1 ) m − i ∗ C m i ∗ g ( i )
=∑mi=1(−1)m−i∗Cim∗in = ∑ i = 1 m ( − 1 ) m − i ∗ C m i ∗ i n
换个形式:
=∑mi=1(−1)i∗Cim∗(m−i)n = ∑ i = 1 m ( − 1 ) i ∗ C m i ∗ ( m − i ) n
则:
Sn,m=1m!∑mi=1(−1)i∗Cim∗(m−i)n S n , m = 1 m ! ∑ i = 1 m ( − 1 ) i ∗ C m i ∗ ( m − i ) n
这个有逆元就很好算一个了。
怎么算 Sn,1−n S n , 1 − n ?
再转换一下:
Sn,m=∑mi=1(−1)i∗i!∗(m−i)n(m−i)! S n , m = ∑ i = 1 m ( − 1 ) i ∗ i ! ∗ ( m − i ) n ( m − i ) !
卷积?NTT!
nk=∑ki=1Cin∗Sk,i∗i! n k = ∑ i = 1 k C n i ∗ S k , i ∗ i !
nk n k 的含义为把k个求放入n的盒子的方案数,i就是枚举非空盒子的个数。