一.两类stirling数的定义及递推公式.
第一类stirling数:定义第一类stirling数 S 1 ( n , m ) S_1(n,m) S1(n,m)表示 n n n个有标号的球分成 m m m个无标号的非空轮换的方案数.
这里的轮换定义为旋转同构但翻转不同构,也就是说 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4和 2 , 3 , 4 , 1 2,3,4,1 2,3,4,1是同一个轮换,但 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4与 4 , 3 , 2 , 1 4,3,2,1 4,3,2,1不是同一个轮换.
第一类stirling数的递推公式分为两种情况转移:
1.把最后一个球单独放在一个轮换中,方案数为
S
1
(
n
−
1
,
m
−
1
)
S_1(n-1,m-1)
S1(n−1,m−1).
2.把最后一个球放在某个轮换的某个球之前,方案数为
(
n
−
1
)
S
1
(
n
−
1
,
m
)
(n-1)S_1(n-1,m)
(n−1)S1(n−1,m).
那么得到第一类stirling数递推公式:
S
1
(
n
,
m
)
=
S
1
(
n
−
1
,
m
−
1
)
+
(
n
−
1
)
S
1
(
n
−
1
,
m
)
S_1(n,m)=S_1(n-1,m-1)+(n-1)S_1(n-1,m)
S1(n,m)=S1(n−1,m−1)+(n−1)S1(n−1,m)
第二类stirling数:定义第二类stirling数 S 2 ( n , m ) S_2(n,m) S2(n,m)表示 n n n个有标号的球分成 m m m个无标号的非空集合的方案数.
与第一类stirling数类似的,第二类stirling数的递推公式同样分为两种情况转移:
1.把最后一个球单独放在一个集合中,方案数为
S
2
(
n
−
1
,
m
−
1
)
S_2(n-1,m-1)
S2(n−1,m−1).
2.把最后一个球放在某个集合中,方案数为
m
S
2
(
n
−
1
,
m
)
mS_2(n-1,m)
mS2(n−1,m).
那么得到第二类stirling数递推公式:
S
2
(
n
,
m
)
=
S
2
(
n
−
1
,
m
−
1
)
+
m
S
2
(
n
−
1
,
m
)
S_2(n,m)=S_2(n-1,m-1)+mS_2(n-1,m)
S2(n,m)=S2(n−1,m−1)+mS2(n−1,m)
二.球与盒子的问题.
球与盒子的问题指的是将 n n n个球放入 m m m个盒子的计数问题,主要根据球有无标号,盒有无标号,是否可以有空盒分为 8 8 8种情况.
接下来我们一一讨论这 8 8 8种情况的解决方案.
情况1:球无标号,盒有标号,不允许空盒.
插板法,答案为 ( n − 1 m − 1 ) \binom{n-1}{m-1} (m−1n−1).
情况2:球无标号,盒有标号,允许空盒.
插板法,答案为 ( n + m − 1 n ) \binom{n+m-1}{n} (nn+m−1).
情况3:球无标号,盒无标号,不允许空盒.
设
f
i
,
j
f_{i,j}
fi,j表示
i
i
i个球放入
j
j
j个盒子的方案数,分两种情况讨论:
1.每个盒子中放入一个球,方案数为
f
i
−
j
,
j
f_{i-j,j}
fi−j,j.
2.将一个球放入一个盒子,方案数为
f
i
−
1
,
j
−
1
f_{i-1,j-1}
fi−1,j−1.
综合起来就是:
f
i
,
j
=
f
i
−
j
,
j
+
f
i
−
1
,
j
−
1
f_{i,j}=f_{i-j,j}+f_{i-1,j-1}
fi,j=fi−j,j+fi−1,j−1
情况4:球无标号,盒无标号,允许空盒.
与情况3类似的有:
f
i
,
j
=
f
i
−
j
,
j
+
f
i
,
j
−
1
f_{i,j}=f_{i-j,j}+f_{i,j-1}
fi,j=fi−j,j+fi,j−1
情况5:球有标号,盒有标号,允许空盒.
每个球可以放入有 m m m种选择,答案为 m n m^{n} mn.
情况6:球有标号,盒无标号,不允许空盒.
答案为第二类stirling数,即 S 2 ( n , m ) S_2(n,m) S2(n,m).
情况7:球有标号,盒无标号,允许空盒.
对第二类stirling数求和,即:
∑
i
=
0
m
S
2
(
n
,
i
)
\sum_{i=0}^{m}S_2(n,i)
i=0∑mS2(n,i)
情况8:球有标号,盒有标号,不允许空盒.
一个办法是对第二类stirling数乘上 m m m的全排列,即 m ! S 2 ( n , m ) m!S_2(n,m) m!S2(n,m).
另一种办法是利用二项式反演,设
f
i
f_i
fi表示
n
n
n个有标号的球在不允许空盒的情况下放入
i
i
i个有标号的盒子的方案数,那么有:
m
n
=
∑
i
=
0
m
(
m
i
)
f
i
⇔
f
m
=
∑
i
=
0
m
(
−
1
)
m
−
i
(
m
i
)
i
n
m^{n}=\sum_{i=0}^{m}\binom{m}{i}f_i\Leftrightarrow f_m=\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^{n}
mn=i=0∑m(im)fi⇔fm=i=0∑m(−1)m−i(im)in
三.第二类stirling数的通项公式.
将
f
i
=
i
!
S
2
(
n
,
i
)
f_i=i!S_2(n,i)
fi=i!S2(n,i)代入第二个式子中我们可以得到:
m
!
S
2
(
n
,
m
)
=
∑
i
=
0
m
(
−
1
)
m
−
i
(
m
i
)
i
n
S
2
(
n
,
m
)
=
∑
i
=
0
m
(
−
1
)
i
i
!
(
m
−
i
)
n
(
m
−
i
)
!
m!S_2(n,m)=\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^{n}\\ S_2(n,m)=\sum_{i=0}^{m}\frac{(-1)^{i}}{i!}\frac{(m-i)^{n}}{(m-i)!}
m!S2(n,m)=i=0∑m(−1)m−i(im)inS2(n,m)=i=0∑mi!(−1)i(m−i)!(m−i)n
这是第二类stirling数通项公式.
容易看出,第二类stirling数的通项公式是一个卷积形式,利用NTT,我们可以在
O
(
m
(
log
n
+
log
m
)
)
O(m(\log n+\log m))
O(m(logn+logm))的时间复杂度内求出一行第二类stirling数.
四.自然数幂和与第二类stirling数.
将
f
i
=
i
!
S
2
(
n
,
i
)
f_i=i!S_2(n,i)
fi=i!S2(n,i)代入第一个式子中我们可以得到:
m
n
=
∑
i
=
0
m
(
m
i
)
i
!
S
2
(
n
,
i
)
=
∑
i
=
0
n
S
2
(
n
,
i
)
m
i
‾
m^{n}=\sum_{i=0}^{m}\binom{m}{i}i!S_2(n,i)=\sum_{i=0}^{n}S_2(n,i)m^{\underline{i}}\\
mn=i=0∑m(im)i!S2(n,i)=i=0∑nS2(n,i)mi
将这个结论带入自然数幂和:
∑
i
=
1
n
i
k
=
∑
i
=
1
n
∑
j
=
0
i
(
i
j
)
j
!
S
2
(
k
,
j
)
=
∑
i
=
0
n
i
!
S
2
(
k
,
i
)
∑
j
=
i
n
(
j
i
)
=
∑
i
=
0
n
i
!
S
2
(
k
,
i
)
(
n
+
1
i
+
1
)
=
∑
i
=
0
n
i
!
(
n
+
1
)
i
+
1
‾
(
i
+
1
)
!
S
2
(
k
,
i
)
=
∑
i
=
0
n
(
n
+
1
)
i
+
1
‾
i
+
1
S
2
(
k
,
i
)
=
∑
i
=
0
k
(
n
+
1
)
i
+
1
‾
i
+
1
S
2
(
k
,
i
)
\sum_{i=1}^{n}i^{k}\\ =\sum_{i=1}^{n}\sum_{j=0}^{i}\binom{i}{j}j!S_2(k,j)\\ =\sum_{i=0}^{n}i!S_2(k,i)\sum_{j=i}^{n}\binom{j}{i}\\ =\sum_{i=0}^{n}i!S_2(k,i)\binom{n+1}{i+1}\\ =\sum_{i=0}^{n}i!\frac{(n+1)^{\underline{i+1}}}{(i+1)!}S_2(k,i)\\ =\sum_{i=0}^{n}\frac{(n+1)^{\underline{i+1}}}{i+1}S_2(k,i)\\ =\sum_{i=0}^{k}\frac{(n+1)^{\underline{i+1}}}{i+1}S_2(k,i)
i=1∑nik=i=1∑nj=0∑i(ji)j!S2(k,j)=i=0∑ni!S2(k,i)j=i∑n(ij)=i=0∑ni!S2(k,i)(i+1n+1)=i=0∑ni!(i+1)!(n+1)i+1S2(k,i)=i=0∑ni+1(n+1)i+1S2(k,i)=i=0∑ki+1(n+1)i+1S2(k,i)
这样就能做到
O
(
k
log
k
)
O(k\log k)
O(klogk)处理自然数幂和了.
五.Bell数.
对第二类stirling数有了更加深入的探讨后,我们再引入它的一行和Bell数.
Bell数:Bell数
B
n
B_n
Bn定义为:
B
n
=
∑
i
=
0
n
S
2
(
n
,
i
)
B_n=\sum_{i=0}^{n}S_2(n,i)
Bn=i=0∑nS2(n,i)
其组合意义为将 n n n个有标号的球划分为若干个无标号的集合的方案数.
我们已经可以做到 O ( n log n ) O(n\log n) O(nlogn)求出单个Bell数,但是这个做法用到了常数大且较为难写的NTT,并不优秀.
来试着将其写成更好计算的形式:
B
n
=
∑
i
=
0
n
S
2
(
n
,
i
)
=
∑
i
=
0
n
∑
j
=
0
i
(
−
1
)
j
j
!
(
i
−
j
)
n
(
i
−
j
)
!
=
∑
i
=
0
n
(
−
1
)
i
i
!
∑
j
=
i
n
(
j
−
i
)
n
(
j
−
i
)
!
=
∑
i
=
0
n
(
−
1
)
i
i
!
∑
j
=
0
n
−
i
j
n
j
!
B_n=\sum_{i=0}^{n}S_2(n,i)\\ =\sum_{i=0}^{n}\sum_{j=0}^{i}\frac{(-1)^{j}}{j!}\frac{(i-j)^{n}}{(i-j)!}\\ =\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}\sum_{j=i}^{n}\frac{(j-i)^{n}}{(j-i)!}\\ =\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}\sum_{j=0}^{n-i}\frac{j^{n}}{j!}
Bn=i=0∑nS2(n,i)=i=0∑nj=0∑ij!(−1)j(i−j)!(i−j)n=i=0∑ni!(−1)ij=i∑n(j−i)!(j−i)n=i=0∑ni!(−1)ij=0∑n−ij!jn
现在只需要对
j
n
j
!
\frac{j^{n}}{j!}
j!jn这个式子求前缀和,就可以直接做到
O
(
n
log
n
)
O(n\log n)
O(nlogn)求解单个Bell数了.
六.Bell数的生成函数.
这个方法可以做到 O ( n log n ) O(n\log n) O(nlogn)求解所有 i ∈ [ 1 , n ] i\in [1,n] i∈[1,n]的Bell数 B i B_i Bi.
首先根据Bell数的组合意义,我们枚举最后一个数所在的集合大小,可以得到如下递推式:
B
n
+
1
=
∑
i
=
0
n
(
n
i
)
B
n
−
i
B_{n+1}=\sum_{i=0}^{n}\binom{n}{i}B_{n-i}
Bn+1=i=0∑n(in)Bn−i
设
B
n
B_n
Bn的指数型生成函数为
B
(
x
)
B(x)
B(x),根据上式容易得到:
B
′
(
x
)
=
B
(
x
)
e
x
B
′
(
x
)
B
(
x
)
=
e
x
∫
B
′
(
x
)
B
(
x
)
d
x
=
e
x
−
1
ln
B
(
x
)
=
e
x
−
1
B
(
x
)
=
e
e
x
−
1
B'(x)=B(x)e^{x}\\ \frac{B'(x)}{B(x)}=e^{x}\\ \int \frac{B'(x)}{B(x)}\mathrm{d}x=e^{x}-1\\ \ln B(x)=e^{x}-1\\ B(x)=e^{e^{x}-1}
B′(x)=B(x)exB(x)B′(x)=ex∫B(x)B′(x)dx=ex−1lnB(x)=ex−1B(x)=eex−1
利用多项式
exp
\exp
exp即可做到
O
(
n
log
n
)
O(n\log n)
O(nlogn)求解.
七.两类stirling数与三种幂.
首先,我们可以尝试得到上升幂和下降幂之间的关系:
x
n
‾
=
∏
i
=
0
n
−
1
(
x
−
i
)
=
(
−
1
)
n
∏
i
=
0
n
−
1
(
−
x
+
i
)
=
(
−
1
)
n
(
−
x
)
n
‾
x
n
‾
=
∏
i
=
0
n
−
1
(
x
+
i
)
=
(
−
1
)
n
∏
i
=
0
n
−
1
(
−
x
−
i
)
=
(
−
1
)
n
(
−
x
)
n
‾
x^{\underline{n}}=\prod_{i=0}^{n-1}(x-i)=(-1)^{n}\prod_{i=0}^{n-1}(-x+i)=(-1)^{n}(-x)^{\overline{n}}\\ x^{\overline{n}}=\prod_{i=0}^{n-1}(x+i)=(-1)^{n}\prod_{i=0}^{n-1}(-x-i)=(-1)^{n}(-x)^{\underline{n}}
xn=i=0∏n−1(x−i)=(−1)ni=0∏n−1(−x+i)=(−1)n(−x)nxn=i=0∏n−1(x+i)=(−1)ni=0∏n−1(−x−i)=(−1)n(−x)n
然后,我们在上面已经得到了幂和下降幂之间的关系:
x
n
=
∑
i
=
0
n
S
2
(
n
,
i
)
x
i
‾
x^{n}=\sum_{i=0}^{n}S_2(n,i)x^{\underline{i}}
xn=i=0∑nS2(n,i)xi
将
x
x
x换成
−
x
-x
−x,我们可以得到幂和上升幂之间的关系:
(
−
x
)
n
=
∑
i
=
0
n
S
2
(
n
,
i
)
(
−
x
)
i
‾
(
−
x
)
n
=
∑
i
=
0
n
(
−
1
)
i
S
2
(
n
,
i
)
x
i
‾
x
n
=
∑
i
=
0
n
(
−
1
)
n
−
i
S
2
(
n
,
i
)
x
i
‾
(-x)^{n}=\sum_{i=0}^{n}S_2(n,i)(-x)^{\underline{i}}\\ (-x)^{n}=\sum_{i=0}^{n}(-1)^{i}S_2(n,i)x^{\overline{i}}\\ x^{n}=\sum_{i=0}^{n}(-1)^{n-i}S_2(n,i)x^{\overline{i}}
(−x)n=i=0∑nS2(n,i)(−x)i(−x)n=i=0∑n(−1)iS2(n,i)xixn=i=0∑n(−1)n−iS2(n,i)xi
我们发现只有第二类stirling数为系数的关系式,于是猜想一个第一类stirling数为系数的关系式:
x
n
‾
=
∑
i
=
0
n
S
1
(
n
,
i
)
x
i
x^{\overline{n}}=\sum_{i=0}^{n}S_1(n,i)x^{i}
xn=i=0∑nS1(n,i)xi
归纳证明后发现它是对的,于是再次将
x
x
x换
−
x
-x
−x可以得到:
x
n
‾
=
∑
i
=
0
n
(
−
1
)
n
−
i
S
1
(
n
,
i
)
x
i
x^{\underline{n}}=\sum_{i=0}^{n}(-1)^{n-i}S_1(n,i)x^{i}
xn=i=0∑n(−1)n−iS1(n,i)xi
于是我们得到了在幂和上升幂、下降幂之间转化的公式.
八.stirling反演.
我们将下降幂与幂的关系式代入幂与下降幂的关系式可以得到:
x
n
=
∑
i
=
0
n
S
2
(
n
,
i
)
x
i
‾
=
∑
i
=
0
n
S
2
(
n
,
i
)
∑
j
=
0
i
(
−
1
)
i
−
j
S
1
(
i
,
j
)
x
j
=
∑
i
=
0
n
∑
j
=
0
i
(
−
1
)
i
−
j
S
2
(
n
,
i
)
S
1
(
i
,
j
)
x
j
=
∑
i
=
0
n
∑
j
=
i
n
(
−
1
)
j
−
i
S
2
(
n
,
j
)
S
1
(
j
,
i
)
x
i
x^{n}=\sum_{i=0}^{n}S_2(n,i)x^{\underline{i}}\\ =\sum_{i=0}^{n}S_2(n,i)\sum_{j=0}^{i}(-1)^{i-j}S_1(i,j)x^{j}\\ =\sum_{i=0}^{n}\sum_{j=0}^{i}(-1)^{i-j}S_2(n,i)S_1(i,j)x^{j}\\ =\sum_{i=0}^{n}\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)x^{i}
xn=i=0∑nS2(n,i)xi=i=0∑nS2(n,i)j=0∑i(−1)i−jS1(i,j)xj=i=0∑nj=0∑i(−1)i−jS2(n,i)S1(i,j)xj=i=0∑nj=i∑n(−1)j−iS2(n,j)S1(j,i)xi
取出其中第
i
i
i项:
[
n
=
i
]
x
i
=
∑
j
=
i
n
(
−
1
)
j
−
i
S
2
(
n
,
j
)
S
1
(
j
,
i
)
x
i
[n=i]x^{i}=\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)x^{i}
[n=i]xi=j=i∑n(−1)j−iS2(n,j)S1(j,i)xi
同时除以
x
i
x^{i}
xi得到反转公式:
[
n
=
i
]
=
∑
j
=
i
n
(
−
1
)
j
−
i
S
2
(
n
,
j
)
S
1
(
j
,
i
)
[n=i]=\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)
[n=i]=j=i∑n(−1)j−iS2(n,j)S1(j,i)
于是我们猜想stirling反演:
f
n
=
∑
i
=
0
n
S
2
(
n
,
i
)
g
i
⇔
g
n
=
∑
i
=
0
n
(
−
1
)
n
−
i
S
1
(
n
,
i
)
f
i
f_n=\sum_{i=0}^{n}S_2(n,i)g_i\Leftrightarrow g_n=\sum_{i=0}^{n}(-1)^{n-i}S_1(n,i)f_i\\
fn=i=0∑nS2(n,i)gi⇔gn=i=0∑n(−1)n−iS1(n,i)fi
代入验证:
f
n
=
∑
i
=
0
n
S
2
(
n
,
i
)
g
i
=
∑
i
=
0
n
S
2
(
n
,
i
)
∑
j
=
0
i
(
−
1
)
i
−
j
S
1
(
i
,
j
)
f
j
=
∑
i
=
0
n
∑
j
=
0
i
(
−
1
)
i
−
j
S
2
(
n
,
i
)
S
1
(
i
,
j
)
f
j
=
∑
i
=
0
n
∑
j
=
i
n
(
−
1
)
j
−
i
S
2
(
n
,
j
)
S
1
(
j
,
i
)
f
j
=
∑
i
=
0
n
[
n
=
i
]
f
i
=
f
n
f_n=\sum_{i=0}^{n}S_2(n,i)g_i\\ =\sum_{i=0}^{n}S_2(n,i)\sum_{j=0}^{i}(-1)^{i-j}S_1(i,j)f_j\\ =\sum_{i=0}^{n}\sum_{j=0}^{i}(-1)^{i-j}S_2(n,i)S_1(i,j)f_j\\ =\sum_{i=0}^{n}\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)f_j\\ =\sum_{i=0}^{n}[n=i]f_i\\ =f_n
fn=i=0∑nS2(n,i)gi=i=0∑nS2(n,i)j=0∑i(−1)i−jS1(i,j)fj=i=0∑nj=0∑i(−1)i−jS2(n,i)S1(i,j)fj=i=0∑nj=i∑n(−1)j−iS2(n,j)S1(j,i)fj=i=0∑n[n=i]fi=fn
同理我们可以得到另一个反转公式和stirling反演:
∑
j
=
i
n
(
−
1
)
j
−
i
S
1
(
n
,
j
)
S
2
(
j
,
i
)
=
[
n
=
i
]
f
n
=
∑
i
=
0
n
S
1
(
n
,
i
)
g
i
⇔
g
n
=
∑
i
=
0
n
(
−
1
)
n
−
i
S
2
(
n
,
i
)
f
i
\sum_{j=i}^{n}(-1)^{j-i}S_1(n,j)S_2(j,i)=[n=i]\\ f_n=\sum_{i=0}^{n}S_1(n,i)g_i\Leftrightarrow g_n=\sum_{i=0}^{n}(-1)^{n-i}S_2(n,i)f_i
j=i∑n(−1)j−iS1(n,j)S2(j,i)=[n=i]fn=i=0∑nS1(n,i)gi⇔gn=i=0∑n(−1)n−iS2(n,i)fi