第一类斯特林数
定义
[
n
m
]
=
[
x
m
]
x
n
‾
\begin{bmatrix}n\\m \end{bmatrix} = [x^m] x ^{\overline{n}}
[nm]=[xm]xn
即
x
x
x的
n
n
n次上升幂的
x
m
x^m
xm项的系数。
从此我们可以得到一个递推公式:
[ n m ] = ( n − 1 ) [ n − 1 m ] + [ n − 1 m − 1 ] \begin{bmatrix}n\\m \end{bmatrix} = (n - 1)\begin{bmatrix}n-1\\m \end{bmatrix} + \begin{bmatrix}n-1\\m-1 \end{bmatrix} [nm]=(n−1)[n−1m]+[n−1m−1]
现在考虑这个递推式的意义,相当于是将 n n n个不同物品分成 m m m个不同的环的方案数。
由此我们可以得到一些奇妙的想法:
先将 n n n个物品分成 m m m组,设每组分别有 a i a_i ai个,那么这时候一组的方案是 ( a i − 1 ) ! (a_i-1)! (ai−1)!,再将每组方案乘起来,就得到了第一类斯特林数。
求法
由定义可以写一个分治 NTT \text{NTT} NTT计算,这里不多做解释。
下面讲一种复杂度低一些的做法
考虑如果已知
x
n
‾
=
∑
i
=
0
n
a
i
x
i
x^{\overline{n}} = \sum_{i = 0}^{n} a_ix^i
xn=∑i=0naixi,要求出
(
x
+
d
)
n
‾
(x+d)^{\overline{n}}
(x+d)n。
将其展开得到
( x + d ) n ‾ = ∑ i = 0 n a i ∑ j = 0 i ( i j ) d i − j x j = ∑ j = 0 n x j ∑ i = j n ( i j ) d i − j a i (x+d)^{\overline{n}} \\ = \sum_{i = 0}^{n}a_i\sum_{j = 0}^i \binom{i}{j} d^{i-j}x^j\\=\sum_{j = 0}^{n}x^j\sum_{i = j}^n \binom{i}{j} d^{i-j}a_i (x+d)n=i=0∑naij=0∑i(ji)di−jxj=j=0∑nxji=j∑n(ji)di−jai
这样就可以 O ( n log n ) O(n\log{n}) O(nlogn)的时间内做出,现在我们就可以合并两个 x n ‾ x^{\overline{n}} xn,这样子,复杂度满足 T ( n ) = T ( n 2 ) + O ( n log n ) = O ( n log n ) T(n) = T(\frac{n}{2}) + O(n\log{n}) = O(n\log{n}) T(n)=T(2n)+O(nlogn)=O(nlogn)
例题
问有多少个 1 − n 1-n 1−n的排列满足有 a a a个前缀最大值, b b b个后缀最大值。
我们考虑以最大值来分开,考虑左右两边,易知左边有 a − 1 a-1 a−1个前缀最大值,右边有 b − 1 b-1 b−1个后缀最大值。
那么我们可以进行分组,满足每组中开头是一个前缀(后缀)最大值,下一组开头是另一个前缀(后缀)最大值。
那么一个大小为 k k k的组,方案是 ( k − 1 ) ! (k-1)! (k−1)!,那不正是第一类斯特林数?所以答案就是 [ n − 1 a − 1 + b − 1 ] ( a − 1 + b − 1 a − 1 ) \begin{bmatrix}n-1\\a-1+b-1 \end{bmatrix} \binom{a - 1 + b - 1}{a - 1} [n−1a−1+b−1](a−1a−1+b−1)
第二类斯特林数
定义
x n = ∑ i = 0 n { n i } x i ‾ x^n = \sum_{i = 0}^{n} \begin{Bmatrix} n\\i\end{Bmatrix} x^{\underline{i}} xn=i=0∑n{ni}xi
由此可到次幂与下降幂之间的关系。
具体的,若要求次幂,我们可以通过转成下降幂来处理:
x n = ∑ i = 0 n { n i } x i ‾ = ∑ i = 0 n { n i } ( x i ) i ! x^n \\= \sum_{i = 0}^{n} \begin{Bmatrix} n\\i\end{Bmatrix} x^{\underline{i}} \\= \sum_{i = 0}^{n} \begin{Bmatrix} n\\i\end{Bmatrix} \binom{x}{i}i! xn=i=0∑n{ni}xi=i=0∑n{ni}(ix)i!
从而可以转成维护组合数。
同样考虑递推式,可以得到 { n i } = { n − 1 i − 1 } + i { n − 1 i } \begin{Bmatrix} n\\i\end{Bmatrix} = \begin{Bmatrix} n - 1\\i - 1\end{Bmatrix} + i \begin{Bmatrix} n-1\\i\end{Bmatrix} {ni}={n−1i−1}+i{n−1i}
还是考虑递推式的意义,意义是将 n n n个不同的物品放入 m m m个相同的盒子中。
下面我们由此得到其通项公式,我们考虑枚举硬点的空盒,然后用硬点容斥系数来计算,就可以得到其通项公式。
{
n
m
}
=
1
m
!
∑
i
=
0
m
(
−
1
)
i
(
m
i
)
(
m
−
i
)
n
\begin{Bmatrix} n\\m\end{Bmatrix} = \frac{1}{m!}\sum_{i=0}^{m}(-1)^i\binom{m}{i} (m - i)^{n}
{nm}=m!1i=0∑m(−1)i(im)(m−i)n
还是其意义,我们分析一波,发现这个第二类斯特林数与等价类有关。也就是说,把 n n n个不同的物品放入 m m m个等价类的方案。
由此我们可以得到一个基本想法。
假设有
n
n
n个物品,每个物品染
1
−
m
1-m
1−m的一个颜色,问有
k
k
k个不同颜色的方案。那么设
g
(
n
)
g(n)
g(n)表示总共的方案数,设
f
(
m
)
f(m)
f(m)表示
n
n
n个物品染
k
k
k种颜色的方案,那么我们有
g
(
n
)
=
∑
i
=
0
n
{
n
i
}
f
(
i
)
g(n) = \sum_{i=0}^{n} \begin{Bmatrix}n\\i\end{Bmatrix}f(i)
g(n)=i=0∑n{ni}f(i)
然后我们又知道如下反演:
g n = ∑ i = 1 n { n i } f i ⇔ f n = ∑ i = 0 n ( − 1 ) n − i [ n i ] g i g_n=\sum_{i=1}^{n}\begin{Bmatrix}n \\ i\end{Bmatrix}f_i \Leftrightarrow f_n=\sum_{i=0}^{n}(-1)^{n-i}\begin{bmatrix}n \\ i\end{bmatrix}g_i gn=i=1∑n{ni}fi⇔fn=i=0∑n(−1)n−i[ni]gi
所以就可以得到 f f f的值。
再丢一道斯特林反演的题目。
那么我们考虑联通块是不是就是等价类?我们先硬点那么考虑一个有 i i i个联通块的方案,相当于至少 i i i个联通块。
那么考虑一个 i i i的方案,会在 i ’ ( i ′ < i ) i’(i'<i) i’(i′<i)中出现 { i i ′ } \begin{Bmatrix}i\\i'\end{Bmatrix} {ii′}次,那么就有 ∑ i ′ = 0 i { i i ′ } f ( i ′ ) = [ i = 0 ] \sum_{i'=0}^{i}\begin{Bmatrix}i\\i'\end{Bmatrix}f(i')= [i = 0] ∑i′=0i{ii′}f(i′)=[i=0]
解得 f ( n ) = ( − 1 ) n − 1 ( n − 1 ) ! f(n) = (-1)^{n-1}(n - 1)! f(n)=(−1)n−1(n−1)!
而且大部分划分等价类的代价都是这个。
顺便说一下第二类斯特林数与贝尔数的关系,贝尔数就是第二类斯特林数一行的数的和。
关于贝尔数,这里有一个好的求法。