很久以前写了第一类斯特林数学习记录,直到现在要学斯特林反演了才填这个第二类斯特林数的坑
做题在推导的时候碰到斯特林数还是很常见的,记录一下,给现在的自己一些印象,也为以后的自己提供复习资料
简单介绍
第二类斯特林数是将n个不同的元素拆分成m个集合的方法数目。——百度百科
还记得吗,第一类斯特林数的是“圆排列”,第二类是“集合”
第一类斯特林数中一个元素数量为
n
n
n圆排列的方案数贡献是
(
n
−
1
)
(n-1)
(n−1)!的,而第二类由于是集合,所以贡献是
1
1
1
第二类斯特林数,可以表示为
S
(
n
,
m
)
S(n,m)
S(n,m),这里是大写
这里补充一下,第一类斯特林数
s
(
n
,
m
)
s(n,m)
s(n,m)能表示为
[
n
m
]
\begin{bmatrix}n\\m\end{bmatrix}
[nm],第二类斯特林数
S
(
n
,
m
)
S(n,m)
S(n,m)能表示为
{
n
m
}
\begin{Bmatrix}n\\m\end{Bmatrix}
{nm}
第一类斯特林数有一个很好的性质
x
n
↓
=
∑
i
=
0
n
[
n
i
]
x
i
x^{n\downarrow}=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}x^i
xn↓=i=0∑n[ni]xi
第二类斯特林数其实同样与下降幂有紧密联系
x
n
=
∑
i
=
0
n
{
n
i
}
x
i
↓
x^n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}x^{i\downarrow}
xn=i=0∑n{ni}xi↓
重点分割线,下面这段很重要
在这里补充一下对这两个式子的解释与推导:
我们定义
x
!
=
1
∗
2
∗
⋅
⋅
⋅
∗
x
x!=1*2*···*x
x!=1∗2∗⋅⋅⋅∗x,特殊的,
0
!
=
1
0!=1
0!=1
在排列组合的基础知识中我们知道
A
(
n
,
m
)
A(n,m)
A(n,m)表示排列数,
C
(
n
,
m
)
C(n,m)
C(n,m)表示组合数
A
(
n
,
m
)
A(n,m)
A(n,m)的意义是从
n
n
n个不同的数中选择
m
m
m个数组成排列的数量,所以:
A
(
n
,
m
)
=
n
(
n
−
1
)
(
n
−
2
)
⋅
⋅
⋅
(
n
−
m
+
1
)
=
n
m
↓
=
n
!
(
n
−
m
)
!
A(n,m)=n(n-1)(n-2)···(n-m+1)=n^{m\downarrow}=\frac{n!}{(n-m)!}
A(n,m)=n(n−1)(n−2)⋅⋅⋅(n−m+1)=nm↓=(n−m)!n!
最后的结果是我们所熟悉的,但其实本质上排列数可以直接表现成下降幂的形式,所以
A
(
n
,
m
)
A(n,m)
A(n,m)可以直接表示为
n
m
↓
n^{m\downarrow}
nm↓
C
(
n
,
m
)
C(n,m)
C(n,m)的意义是从
n
n
n个不同的数中选择
m
m
m个数组成集合(即无序)的数量,所以:
C
(
n
,
m
)
=
A
(
n
,
m
)
m
!
=
n
!
(
n
−
m
)
!
m
!
C(n,m)=\frac{A(n,m)}{m!}=\frac{n!}{(n-m)!m!}
C(n,m)=m!A(n,m)=(n−m)!m!n!
另外,
C
(
n
,
m
)
C(n,m)
C(n,m)同样也可以被表示为
(
n
m
)
\binom{n}{m}
(mn)
Review:第一类斯特林数
[
n
m
]
u
\begin{bmatrix}n\\m\end{bmatrix}_u
[nm]u表示表示将 n 个不同元素构成m个圆排列的数目
我们来看这个式子:
x
n
↑
=
∑
i
=
0
n
[
n
i
]
u
x
i
x^{n\uparrow}=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}_ux^i
xn↑=i=0∑n[ni]uxi
设
0
0
0到
n
−
1
n-1
n−1这
n
n
n个数中选出
m
m
m个数,所有选法的
m
m
m个数乘积的和的值为
f
(
n
,
m
)
f(n,m)
f(n,m),我们发现
f
(
n
,
m
)
f(n,m)
f(n,m)就是上升幂的
(
n
−
m
)
(n-m)
(n−m)次项系数
我们考虑怎么求这个
f
f
f,用递推,发现
f
(
n
,
m
)
=
f
(
n
−
1
,
m
)
+
(
n
−
1
)
∗
f
(
n
−
1
,
m
−
1
)
f(n,m)=f(n-1,m)+(n-1)*f(n-1,m-1)
f(n,m)=f(n−1,m)+(n−1)∗f(n−1,m−1)
对比无符号第一类斯特林数的递推式
s
u
(
n
,
m
)
=
s
u
(
n
−
1
,
m
−
1
)
+
(
n
−
1
)
∗
s
u
(
n
−
1
,
m
)
s_u(n,m)=s_u(n-1,m-1)+(n-1)*s_u(n-1,m)
su(n,m)=su(n−1,m−1)+(n−1)∗su(n−1,m)
是否发现两者有异曲同工之妙呢?
我们发现,设
f
(
n
,
m
)
=
f
′
(
n
,
n
−
m
)
f(n,m)=f'(n,n-m)
f(n,m)=f′(n,n−m)
f
(
n
,
m
)
=
f
(
n
−
1
,
m
)
+
(
n
−
1
)
∗
f
(
n
−
1
,
m
−
1
)
⇒
f
(
n
,
n
−
m
)
=
f
(
n
−
1
,
n
−
m
)
+
(
n
−
1
)
∗
f
(
n
−
1
,
n
−
m
−
1
)
⇒
f
′
(
n
,
m
)
=
f
′
(
n
−
1
,
m
−
1
)
+
(
n
−
1
)
∗
f
′
(
n
−
1
,
m
)
f(n,m)=f(n-1,m)+(n-1)*f(n-1,m-1)\\ \Rightarrow f(n,n-m)=f(n-1,n-m)+(n-1)*f(n-1,n-m-1)\\ \Rightarrow f'(n,m)=f'(n-1,m-1)+(n-1)*f'(n-1,m)
f(n,m)=f(n−1,m)+(n−1)∗f(n−1,m−1)⇒f(n,n−m)=f(n−1,n−m)+(n−1)∗f(n−1,n−m−1)⇒f′(n,m)=f′(n−1,m−1)+(n−1)∗f′(n−1,m)
没错,
f
′
=
s
u
f'=s_u
f′=su
好了,那么我们就知道
x
n
↑
=
∑
i
=
0
n
[
n
i
]
u
x
i
x^{n\uparrow}=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}_ux^i
xn↑=∑i=0n[ni]uxi的正确性
我们把无符号第一类斯特林数,换成有符号第一类斯特林数的,就有
x
n
↓
=
∑
i
=
0
n
[
n
i
]
s
x
i
x^{n\downarrow}=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}_sx^i
xn↓=i=0∑n[ni]sxi
第一个式子证毕(可以通过这个公式在
Θ
(
n
l
o
g
2
n
)
\Theta(nlog^2n)
Θ(nlog2n)的复杂度内用分治+FFT求出某个
n
n
n对应的所有
s
u
(
n
,
m
)
s_u(n,m)
su(n,m)值)
我们再考虑第二个式子
我们把
n
n
n个不同数放在
x
x
x个带标号集合里面,那么总方案数是
x
n
x^n
xn
我们考虑从另外一种方式来计算方案数,我们枚举非空的集合数量,通过第二类斯特林数计算非空集合的放法数,在乘上组合数就好了,即
x
n
=
∑
i
=
0
x
{
n
i
}
(
x
i
)
i
!
x^n=\sum_{i=0}^x\begin{Bmatrix}n\\i\end{Bmatrix}\binom{x}{i}i!
xn=i=0∑x{ni}(ix)i!
根据
C
(
n
,
m
)
∗
m
!
=
A
(
n
,
m
)
C(n,m)*m!=A(n,m)
C(n,m)∗m!=A(n,m),式子变成
x
n
=
∑
i
=
0
x
{
n
i
}
x
i
↓
x^n=\sum_{i=0}^x\begin{Bmatrix}n\\i\end{Bmatrix}x^{i\downarrow}
xn=i=0∑x{ni}xi↓
证毕(另外,其实好像有数学归纳法的证明,本质是一样的)
计算公式
根据定义进行一波容斥我们可以写出如下式子(这里是枚举空盒子)
S
(
n
,
m
)
=
1
m
!
∑
k
=
0
m
(
−
1
)
k
(
m
k
)
(
m
−
k
)
n
S(n,m)=\frac1{m!}\sum_{k=0}^m(-1)^k\binom{m}{k}(m-k)^n
S(n,m)=m!1k=0∑m(−1)k(km)(m−k)n
我们把组合数展开
S
(
n
,
m
)
=
1
m
!
∑
k
=
0
m
(
−
1
)
k
m
!
k
!
(
m
−
k
)
!
(
m
−
k
)
n
S(n,m)=\frac1{m!}\sum_{k=0}^m(-1)^k\frac{m!}{k!(m-k)!}(m-k)^n
S(n,m)=m!1k=0∑m(−1)kk!(m−k)!m!(m−k)n
整理
S
(
n
,
m
)
=
∑
k
=
0
m
(
−
1
)
k
k
!
⋅
(
m
−
k
)
n
(
m
−
k
)
!
S(n,m)=\sum_{k=0}^m\frac{(-1)^k}{k!}·\frac{(m-k)^n}{(m-k)!}
S(n,m)=k=0∑mk!(−1)k⋅(m−k)!(m−k)n
发现这是卷积形式
所以对于某个
n
n
n,我们要求出对于所有
m
m
m的
S
(
n
,
m
)
S(n,m)
S(n,m)模意义下的值,用NTT是只要
Θ
(
n
l
o
g
n
)
\Theta(nlogn)
Θ(nlogn)的
update by 2019.3.5: 附一个应用这个预处理的题目:Team Work(CF 932 E)&[bzoj5093][Lydsy1711月赛]图的价值
与第一类斯特林数类似,第二类斯特林数也有递推式
想一下对于
S
(
n
,
m
)
S(n,m)
S(n,m)
若
n
=
0
n=0
n=0,
m
=
0
m=0
m=0方案数为1
若
n
≠
0
n\neq0
n̸=0,
m
=
0
m=0
m=0方案数为0
若
n
≠
0
n\neq0
n̸=0,
m
≠
0
m\neq0
m̸=0
那么考虑转移
如果由
S
(
n
−
1
,
m
−
1
)
S(n-1,m-1)
S(n−1,m−1)转移来,那么自成一个集合
倘若由
S
(
n
−
1
,
m
)
S(n-1,m)
S(n−1,m)转移而来,则说明新来的一个点插入到
m
m
m个集合中的任何一个集合
递推式:
S
(
n
,
m
)
=
S
(
n
−
1
,
m
−
1
)
+
m
∗
S
(
n
−
1
,
m
)
S(n,m)=S(n-1,m-1)+m*S(n-1,m)
S(n,m)=S(n−1,m−1)+m∗S(n−1,m)
性质
S
(
n
,
1
)
=
S
(
n
,
n
)
=
1
S(n,1)=S(n,n)=1
S(n,1)=S(n,n)=1
好像很显然啊,各种性质似乎都是挺特殊的
然后还有就是这个
∑
i
=
0
n
S
(
n
,
m
)
=
B
n
\sum_{i=0}^nS(n,m)=B_n
i=0∑nS(n,m)=Bn
貌似
B
n
B_n
Bn是贝尔数,不懂不懂
应用
推公式可能会用到,反正我还不能灵活应用