斯特林数
斯特林数有第一类斯特林数和第二类斯特林数
第一类斯特林数
有
n
n
n个不同的元素,需要将这
n
n
n个元素组成
m
m
m个圆环,问方法数。这个方法数就是第一类斯特林数,记作
s
(
n
,
m
)
s(n,m)
s(n,m)。对于第一类斯特林数,可以有这样的递推过程,对于
s
(
n
,
m
)
s(n,m)
s(n,m),假设已经知道
s
(
n
−
1
,
m
)
s(n-1,m)
s(n−1,m)和
s
(
n
−
1
,
m
−
1
)
s(n-1,m-1)
s(n−1,m−1),对于
s
(
n
−
1
,
m
−
1
)
s(n-1,m-1)
s(n−1,m−1),可以将第
n
n
n个元素自己组成一个环,对于
s
(
n
−
1
,
m
)
s(n-1,m)
s(n−1,m),可以将第
n
n
n个元素放到前
n
−
1
n-1
n−1任意一个元素的左侧,所以关于
s
(
n
,
m
)
s(n,m)
s(n,m)有:
s
(
n
,
m
)
=
n
∗
s
(
n
−
1
,
m
)
+
s
(
n
,
m
−
1
)
s(n,m)=n*s(n-1,m)+s(n,m-1)
s(n,m)=n∗s(n−1,m)+s(n,m−1)
上面介绍的是无符号第一类斯特林数,对于有符号第一类斯特林数未来有机会再学习。
第二类斯特林数
有
n
n
n个不同的元素,需要将这
n
n
n个元素分成
m
m
m个集合,问方法数。这个方法数就是第二类斯特林数,也记作
s
(
n
,
m
)
s(n,m)
s(n,m)。对于第二类斯特林数,可以有这样的递推过程,对于
s
(
n
,
m
)
s(n,m)
s(n,m),假设已经知道
s
(
n
−
1
,
m
)
s(n-1,m)
s(n−1,m)和
s
(
n
−
1
,
m
−
1
)
s(n-1,m-1)
s(n−1,m−1),对于
s
(
n
−
1
,
m
−
1
)
s(n-1,m-1)
s(n−1,m−1),可以将第
n
n
n个元素自己新开一个集合,对于
s
(
n
−
1
,
m
)
s(n-1,m)
s(n−1,m),可以将第
n
n
n个元素放入
m
m
m个集合任意一个集合,所以关于
s
(
n
,
m
)
s(n,m)
s(n,m)有:
s
(
n
,
m
)
=
m
∗
s
(
n
−
1
,
m
)
+
s
(
n
−
1
,
m
−
1
)
s(n,m)=m*s(n-1,m)+s(n-1,m-1)
s(n,m)=m∗s(n−1,m)+s(n−1,m−1)
除了递推式,第二类斯特林数还有一组可以直接计算的公式:
s
(
n
,
m
)
=
1
m
!
∑
k
=
0
m
(
−
1
)
k
C
(
m
,
k
)
(
m
−
k
)
n
s(n,m)=\frac{1}{m!}\sum_{k=0}^{m}(-1)^kC(m,k)(m-k)^n
s(n,m)=m!1k=0∑m(−1)kC(m,k)(m−k)n
对于这个式子,可以使用容斥定理证明。先区分
m
m
m个集合,给每个集合标上号,这时候总的方案数就是
m
n
m^n
mn,即
n
n
n个元素可以任意选择
m
m
m个集合,我们可以发现这里面还包括了一些空集合的情况,将存在空集合的情况去掉就能得到我们的答案,令
T
(
h
)
T(h)
T(h)表示空集合数目为
h
h
h的情况数,则很容易得到下面的式子:
m
n
=
∑
h
=
0
m
T
(
h
)
m^n=\sum_{h=0}^mT(h)
mn=h=0∑mT(h)
T
(
0
)
T(0)
T(0)是我们的答案,现在我们尝试去掉空集合数大于1的情况,我们随机选择一个集合作为空集合,有
C
(
m
,
1
)
C(m,1)
C(m,1)的选法,然后对
n
n
n个元素随机放入剩余
m
−
1
m-1
m−1个集合,则总的方案数有:
S
1
=
C
(
m
,
1
)
∗
(
m
−
1
)
n
S_1=C(m,1)*(m-1)^{n}
S1=C(m,1)∗(m−1)n
对于
S
1
S_1
S1,可以发现对于
T
(
2
)
T(2)
T(2)的情况统计了两次,对于
T
(
h
)
T(h)
T(h)的情况统计了
h
h
h次,这意味减去
S
1
S_1
S1会变成:
m
n
−
S
1
=
T
(
0
)
+
T
(
1
)
+
.
.
.
+
T
(
m
)
−
T
(
1
)
−
2
∗
T
(
2
)
−
.
.
.
−
m
∗
T
(
m
)
=
T
(
0
)
−
T
(
2
)
−
2
∗
T
(
3
)
−
.
.
.
−
(
m
−
1
)
∗
T
(
m
)
m^n-S_1=T(0)+T(1)+...+T(m)-T(1)-2*T(2)-...-m*T(m)\\=T(0)-T(2)-2*T(3)-...-(m-1)*T(m)
mn−S1=T(0)+T(1)+...+T(m)−T(1)−2∗T(2)−...−m∗T(m)=T(0)−T(2)−2∗T(3)−...−(m−1)∗T(m)
我们的目标是得到
T
(
0
)
T(0)
T(0),所以需要把
T
(
2
)
T(2)
T(2)加回来,于是同样的,有
S
2
S_2
S2:
S
2
=
C
(
m
,
2
)
∗
(
m
−
2
)
n
=
T
(
2
)
+
C
(
3
,
2
)
∗
T
(
3
)
+
.
.
.
+
C
(
m
,
2
)
∗
T
(
m
)
S_2=C(m,2)*(m-2)^{n}=T(2)+C(3,2)*T(3)+...+C(m,2)*T(m)
S2=C(m,2)∗(m−2)n=T(2)+C(3,2)∗T(3)+...+C(m,2)∗T(m)
把
S
2
S_2
S2加上有:
m
n
−
S
1
+
S
2
=
T
(
0
)
+
T
(
3
)
+
3
∗
T
(
4
)
+
.
.
.
+
(
m
−
1
)
2
∗
T
(
m
)
m^n-S_1+S_2=T(0)+T(3)+3*T(4)+...+(m-1)^2*T(m)
mn−S1+S2=T(0)+T(3)+3∗T(4)+...+(m−1)2∗T(m)
利用数学归纳法很容易可以证明:
S
k
=
C
(
m
,
k
)
∗
(
m
−
k
)
n
=
T
(
k
)
+
C
(
k
+
1
,
k
)
∗
T
(
k
+
1
)
+
.
.
.
+
C
(
m
,
k
)
∗
T
(
m
)
S_k=C(m,k)*(m-k)^n=T(k)+C(k+1,k)*T(k+1)+...+C(m,k)*T(m)
Sk=C(m,k)∗(m−k)n=T(k)+C(k+1,k)∗T(k+1)+...+C(m,k)∗T(m)
T
(
0
)
=
m
n
−
∑
k
=
1
m
(
−
1
)
k
S
k
=
∑
k
=
0
m
(
−
1
)
k
C
(
m
,
k
)
(
m
−
k
)
n
T(0)=m^n-\sum_{k=1}^m(-1)^kS_k=\sum_{k=0}^m(-1)^kC(m,k)(m-k)^n
T(0)=mn−k=1∑m(−1)kSk=k=0∑m(−1)kC(m,k)(m−k)n
前面提到
T
(
0
)
T(0)
T(0)是
n
n
n个不同元素放入
m
m
m个不同集合的种数,而第二类斯特林数是
n
n
n个不同元素放入
m
m
m个相同集合的种数,所以第二类斯特林数有以下结果:
S
(
n
,
m
)
=
1
m
!
T
(
0
)
=
1
m
!
∑
k
=
0
m
(
−
1
)
k
C
(
m
,
k
)
(
m
−
k
)
n
S(n,m)=\frac{1}{m!}T(0)=\frac{1}{m!}\sum_{k=0}^m(-1)^kC(m,k)(m-k)^n
S(n,m)=m!1T(0)=m!1k=0∑m(−1)kC(m,k)(m−k)n