第二类斯特林数
定义
无符号第二类斯特林数 { n m } \begin{Bmatrix} n \\ m \end{Bmatrix} {nm} (也可记做 S ( n , m ) S(n,m) S(n,m))表示,将 n n n 个不同的球放入 m m m 个相同的盒子,且每个盒子非空的方案数。
例如,
{
3
2
}
=
3
\begin{Bmatrix} 3 \\ 2 \end{Bmatrix}=3
{32}=3。这里的三种分配方案分别为:
①在第一个盒子中放编号为
1
,
2
1,2
1,2 的球,在第二个盒子中放编号为
3
3
3 的球;
②在第一个盒子中放编号为
1
,
3
1,3
1,3 的球,在第二个盒子中放编号为
2
2
2 的球;
③在第一个盒子中放编号为
2
,
3
2,3
2,3 的球,在第二个盒子中放编号为
1
1
1 的球。
有符号第二类斯特林数表示,将 n n n 个不同的球放入 m m m 个不同的盒子,且每个盒子非空的方案数。
求法
递推公式
{ n m } = { n − 1 m − 1 } + m { n − 1 m } \begin{Bmatrix} n \\ m \end{Bmatrix}=\begin{Bmatrix} n-1 \\ m-1 \end{Bmatrix}+m\begin{Bmatrix} n-1 \\ m \end{Bmatrix} {nm}={n−1m−1}+m{n−1m}
这里对上述公式做出简要阐释。
考虑第
n
n
n 个球的放法。
①将它放入一个新的盒子里面,这对应着
{
n
−
1
m
−
1
}
\begin{Bmatrix} n-1 \\ m-1 \end{Bmatrix}
{n−1m−1} ;
②将它放入一个已经存在的盒子里面。由于当前共有
m
m
m 个盒子,所以共有
m
m
m 个位置可以放置,即
m
×
{
n
−
1
m
}
m \times \begin{Bmatrix} n-1 \\ m \end{Bmatrix}
m×{n−1m} 。
通项公式
{ 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 {m \choose i} (m-i)^n {nm}=m!1i=0∑m(−1)i(im)(m−i)n
这里对上述公式做出简要阐释。
上式中 i i i 表示空盒子的数量。 ( − 1 ) i (-1)^i (−1)i 表示一种容斥, ( m i ) m \choose i (im) 表示在 m m m 个盒子中钦定 i i i 个空盒子。不难发现,现在有 m − i m-i m−i 个可以放球的盒子,所以每个球都有 m − i m-i m−i 个位置可以放,根据乘法原理不难得到 ( m − i ) n (m-i)^n (m−i)n 。注意,由于每个盒子相同,所以最后还要除以 m ! m! m! 。
从而,我们得到了上面的通项公式。
如果对这个公式依然没有基于实际意义上的理解,请继续往下看。
求一整行的值
我们拆开通项公式中的组合数,得到
{ n m } = m ! ∑ i = 0 m ( − 1 ) i 1 i ! 1 ( m − i ) ! ( m − i ) n \begin{Bmatrix} n \\ m \end{Bmatrix}=m!\sum_{i=0}^m (-1)^i \frac {1} {i!} \frac {1}{(m-i)!} (m-i)^n {nm}=m!i=0∑m(−1)ii!1(m−i)!1(m−i)n
令 f i = ( − 1 ) i i ! f_i=\frac {(-1)^i} {i!} fi=i!(−1)i, g i = i n i ! g_i=\frac {i^n} {i!} gi=i!in ,那么原式可以写为
{ n m } = m ! ∑ i = 0 m f i g m − i \begin{Bmatrix} n \\ m \end{Bmatrix}=m!\sum_{i=0}^m f_i \ g_{m-i} {nm}=m!i=0∑mfi gm−i
不难发现,这是一个卷积的形式。
于是,我们直接做一遍 NTT 即可。
求一整列的值
此时,盒子的数量不变,但是球的数量会变。
考虑给每个盒子一个指数生成函数。
F
(
x
)
=
∑
i
=
1
∞
x
i
i
!
F(x)=\sum_{i=1}^{∞} \frac {x^i} {i!}
F(x)=i=1∑∞i!xi
显然有 F ( x ) = e x − 1 F(x)=e^x-1 F(x)=ex−1 。
不难发现:
k ! ∑ i = 0 ∞ { i k } x i i ! = F ( x ) k k! \sum_{i=0}^{∞} \dfrac {\begin{Bmatrix} i \\ k\end{Bmatrix}x^i} {i!}=F(x)^k k!i=0∑∞i!{ik}xi=F(x)k
于是,我们求出 e x − 1 e^x-1 ex−1 ,然后大力多项式快速幂求出 F ( x ) k F(x)^k F(x)k ,最后再回带即可得到这一整列的斯特林数。
直接套用多项式快速幂的板子即可。注意常数项为 0 0 0 ,要先降次(除以 x x x ,系数整体左移一位),再快速幂,最后再升次(乘 x k x^k xk ,系数整体右移一位)。
性质
这个性质非常重要,请你朗读背诵,明天默写 把它记住。
n m = ∑ i = 0 m { m i } ( n i ) i ! n^m=\sum_{i=0}^m \begin{Bmatrix} m \\ i \end{Bmatrix} {n \choose i}i! nm=i=0∑m{mi}(in)i!
下面对这个式子做出简要阐述。
左式中的 n m n^m nm 表示,将 m m m 个不同的球放入 n n n 个不同的盒子的方案数,盒子可以为空。右式中的 i i i 表示非空盒子的数量, ( n i ) n \choose i (in) 表示在 n n n 个盒子中选择这样的 i i i 个盒子; { m i } i ! \begin{Bmatrix} m \\ i \end{Bmatrix}i! {mi}i! 表示将 m m m 个不同的球放入 i i i 个不同的盒子中的方案数,要求盒子不能为空。
另外,将这个式子给大力二项式反演就得到了第二类斯特林数的通项公式。
应用
CF1278 Cards
Crash的文明世界
幼儿园篮球题
组合数问题
CF961G Partitions
*CF1278 Cards加强版
其中:
CF1278 Cards 的题解在这。
CF1278 Cards加强版的题解在这 。
Crash 的文明世界的题解在这 。
第一类斯特林数
定义
第一类斯特林数 [ n m ] \begin{bmatrix} n \\ m \end{bmatrix} [nm] (也可记做 s ( n , m ) s(n,m) s(n,m))表示,将 n n n 个不同的数划分为 m m m 个不同圆排列的方案数。
例如,
[
4
2
]
=
11
\begin{bmatrix} 4 \\ 2 \end{bmatrix}=11
[42]=11 。这里的
11
11
11 种划分方案分别为:
①第一个排列中包含
1
1
1 ,第二个排列中包含
2
,
3
,
4
2,3,4
2,3,4 。第一个的内部排列有
1
1
1 种,第二个的内部排列有
2
2
2 种(
2
,
3
,
4
2,3,4
2,3,4 和
3
,
2
,
4
3,2,4
3,2,4 ,注意循环同构的只算一种);
②第一个排列中包含
2
2
2 ,第二个排列中包含
1
,
3
,
4
1,3,4
1,3,4,内部排列分别有
1
,
2
1,2
1,2 种;
⋯
⋯
\cdots \cdots
⋯⋯
⑤第一个排列中包含
1
,
2
1,2
1,2 ,第二个排列中包含
3
,
4
3,4
3,4 ,内部排列分别有
1
,
1
1,1
1,1 种(注意
1
,
2
1,2
1,2 与
2
,
1
2,1
2,1 循环同构,只算一种);
⋯
⋯
\cdots \cdots
⋯⋯
求法
递推公式
[ 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 − 1 m − 1 ] \begin{bmatrix} n-1 \\ m-1 \end{bmatrix} [n−1m−1] 表示,将新增的第 n n n 个数放入一个盒子里面, [ n − 1 m ] \begin{bmatrix} n-1 \\ m \end{bmatrix} [n−1m] 则相反。前面的那个系数 n − 1 n-1 n−1 表示,将第 n n n 个数放到 n − 1 n-1 n−1 个已有的数中的任何一个左边。
求一整行的斯特林数
第一类斯特林数有一个性质:
x n ‾ = ∑ i = 0 n [ n i ] x i x^{\overline n}=\sum_{i=0}^n \begin{bmatrix} n \\ i \end{bmatrix} x^i xn=i=0∑n[ni]xi
若我们把它看做一个关于 x x x 的多项式,那么 x x x 的 n n n 次下降幂的各项系数即为这一行的斯特林数。
直接分治 NTT 的话,时间复杂度为 O ( n log 2 n ) O(n \log^2 n) O(nlog2n) 。我们需要优化。
令
G
(
x
)
=
x
n
‾
=
∏
i
=
0
n
−
1
(
x
+
i
)
=
∑
i
=
0
n
−
1
g
i
x
i
G(x)=x^{\overline n}=\prod_{i=0}^{n-1} (x+i)=\sum_{i=0}^{n-1} g_i\ x^i
G(x)=xn=i=0∏n−1(x+i)=i=0∑n−1gi xi
A ( x ) = x 2 n ‾ = ∏ i = 0 2 n − 1 ( x + i ) = ∑ i = 0 2 n − 1 a i x i A(x)=x^{\overline{2n}}=\prod_{i=0}^{2n-1} (x+i)=\sum_{i=0}^{2n-1} a_i\ x^i A(x)=x2n=i=0∏2n−1(x+i)=i=0∑2n−1ai xi
F ( x ) = ∏ i = n 2 n − 1 ( x + i ) = ∏ i = 0 n − 1 ( ( x + n ) + i ) = ∑ i = 0 n − 1 f i x i F(x)=\prod_{i=n}^{2n-1} (x+i)=\prod_{i=0}^{n-1} ((x+n)+i)=\sum_{i=0}^{n-1} f_i \ x^{i} F(x)=i=n∏2n−1(x+i)=i=0∏n−1((x+n)+i)=i=0∑n−1fi xi
显然有 G ( x ) F ( x ) = A ( x ) G(x)F(x)=A(x) G(x)F(x)=A(x) 。所以,现在关键在于求出 F ( x ) F(x) F(x)。
我们把 x + n x+n x+n 看成一个整体,那么式子就与 G G G 长得一样了。从而
F ( x ) = ∑ i = 0 n − 1 f i ( x + n ) i F(x)=\sum_{i=0}^{n-1} f_i \ (x+n)^i F(x)=i=0∑n−1fi (x+n)i
F ( x ) = ∑ i = 0 n − 1 f i ∑ j = 0 i ( i j ) x j n i − j F(x)=\sum_{i=0}^{n-1} f_i \ \sum_{j=0}^i {i \choose j} x^j n^{i-j} F(x)=i=0∑n−1fi j=0∑i(ji)xjni−j
F ( x ) = ∑ j = 0 n − 1 x j ∑ i = j n − 1 ( i j ) n i − j f i F(x)=\sum_{j=0}^{n-1} x^j \sum_{i=j}^{n-1} {i \choose j} n^{i-j} f_i F(x)=j=0∑n−1xji=j∑n−1(ji)ni−jfi
F ( x ) = ∑ j = 0 n − 1 x j j ! ∑ i = j n − 1 ( i ! f i ) × ( n i − j ( i − j ) ! ) F(x)=\sum_{j=0}^{n-1} \frac {x^j} {j!} \ \sum_{i=j}^{n-1} (i! \ f_i) \times(\frac {n^{i-j}} {(i-j)!}) F(x)=j=0∑n−1j!xj i=j∑n−1(i! fi)×((i−j)!ni−j)
令 p i = i ! f i p_i=i!\ f_i pi=i! fi, q i = n i i ! q_i=\dfrac {n^i} {i!} qi=i!ni ,那么
F ( x ) = ∑ j = 0 n − 1 x j j ! ∑ i = j n − 1 p i q i − j F(x)=\sum_{j=0}^{n-1} \frac {x^j} {j!} \sum_{i=j}^{n-1} p_i q_{i-j} F(x)=j=0∑n−1j!xji=j∑n−1piqi−j
现在关键在于计算出后面的那个 ∑ i = j n − 1 p i q i − j \sum_{i=j}^{n-1} p_i q_{i-j} ∑i=jn−1piqi−j 。
我们套路地将 p p p 翻转一下:
F j = 1 j ! ∑ i = j n − 1 p n − i + 1 q i − j F_j=\frac 1 {j!}\sum_{i=j}^{n-1} p_{n-i+1} q_{i-j} Fj=j!1i=j∑n−1pn−i+1qi−j
于是我们直接将 p , q p,q p,q 给卷起来再翻转回去,最后第 j j j 项除以 j ! j! j! 就得到了 F ( x ) F(x) F(x) 的各项系数。
直接倍增即可。
令时间复杂度为
T
(
n
)
T(n)
T(n) ,那么显然有
T
(
n
)
=
n
log
n
+
T
(
n
2
)
T(n)=n \log n+T(\frac n 2)
T(n)=nlogn+T(2n)
于是 T ( n ) = O ( n log n ) T(n)=O(n \log n) T(n)=O(nlogn) 。
求一整列的斯特林数
与第二类斯特林数中所说的方法类似。
由于一个长度为
n
n
n 的圆排列有
n
!
n
\frac {n!} {n}
nn! 种,所以对于一个圆排列,它的 EGF 应为
F
(
x
)
=
∑
i
=
1
∞
i
!
i
x
i
i
!
=
∑
i
=
1
∞
x
i
i
F(x)=\sum_{i=1}^{∞} \frac {i!} {i} \frac {x^i} {i!}=\sum_{i=1}^{∞} \frac {x^i} {i}
F(x)=i=1∑∞ii!i!xi=i=1∑∞ixi
答案即为 F ( x ) k F(x)^k F(x)k 的各项系数。
直接套用多项式快速幂的板子即可。注意常数项为 0 0 0 ,要先降次(除以 x x x ,系数整体左移一位),再快速幂,最后再升次(乘 x k x^k xk ,系数整体右移一位)。
性质
n m ‾ = ∑ i = 0 m [ m i ] n i n^{\overline m}=\sum_{i=0}^m \begin{bmatrix} m \\ i \end{bmatrix} n^i nm=i=0∑m[mi]ni
n m ‾ = ∑ i = 0 m [ m i ] ( − 1 ) m − i n i n^{\underline m}=\sum_{i=0}^m\begin{bmatrix} m \\ i \end{bmatrix} (-1)^{m-i} n^i nm=i=0∑m[mi](−1)m−ini
例题
CF960G Bandit Blues
它的题解在这。