第一类斯特林数 [ n m ] \begin{bmatrix}n\\m\end{bmatrix} [nm]
表示把
n
n
n 个不同的数分为
m
m
m 个环排列的方案数,考虑最后一个元素是否形成一个新环排列,可以得到
[
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]
另外,每一个排列实际上与一个环排列的集合等价, 比如 2 4 1 3 2~4~1~3 2 4 1 3等价于环排列 [ 1 , 2 ] [ 3 , 4 ] [1,2][3,4] [1,2][3,4], 1 4 3 2 1~4~3~2 1 4 3 2等价于 [ 1 ] [ 2 , 4 ] [ 3 ] [1][2,4][3] [1][2,4][3],所以 ∑ k = 0 n [ n k ] = n ! \sum\limits_{k=0}^n\begin{bmatrix}n\\k\end{bmatrix}=n! k=0∑n[nk]=n!
第二类斯特林数 { n m } \begin{Bmatrix}n\\m\end{Bmatrix} {nm}
表示把
n
n
n 个不同的数分为
m
m
m 个非空集合的方案数,考虑最后一个元素是否形成一个新集合,可以得到
{
n
m
}
=
m
{
n
−
1
m
}
+
{
n
−
1
m
−
1
}
\begin{Bmatrix}n\\m\end{Bmatrix}=m\begin{Bmatrix}n-1\\m\end{Bmatrix}+\begin{Bmatrix}n-1\\m-1\end{Bmatrix}
{nm}=m{n−1m}+{n−1m−1}
第二类斯特林数(行)求法:
用容斥的想法,用所有方案减去强制有
k
k
k个空集的方案,并把集合看做有序最后除去
m
!
m!
m!,可以得到:
{
n
m
}
=
1
m
!
∑
k
=
0
m
(
−
1
)
k
(
m
k
)
(
m
−
k
)
n
\begin{Bmatrix}n\\m\end{Bmatrix}=\frac 1{m!}\sum_{k=0}^m(-1)^k\binom mk(m-k)^n
{nm}=m!1k=0∑m(−1)k(km)(m−k)n
用这个式子可以
O
(
m
)
O(m)
O(m)算出某个
{
n
m
}
\begin{Bmatrix}n\\m\end{Bmatrix}
{nm},而式子是卷积形式,可以FFT优化做到
O
(
n
log
n
)
O(n\log n)
O(nlogn)求出任意的
{
n
k
}
\begin{Bmatrix}n\\k\end{Bmatrix}
{nk}
第二类斯特林数(列)求法:
常幂转下降幂:
x
n
=
∑
k
=
0
n
{
n
k
}
x
k
‾
(1.1)
x^n=\sum_{k=0}^n\begin{Bmatrix}n\\k\end{Bmatrix}x^{\underline k}\tag {1.1}
xn=k=0∑n{nk}xk(1.1)
因为
x
∗
x
k
‾
=
x
k
+
1
‾
+
k
x
k
‾
x*x^{\underline k}=x^{\underline {k+1}}+k{x^{\underline k}}
x∗xk=xk+1+kxk,所以
x
∗
x
n
−
1
=
x
∗
∑
k
{
n
−
1
k
}
x
k
‾
=
∑
k
{
n
−
1
k
−
1
}
x
k
‾
+
k
{
n
−
1
k
}
x
k
‾
=
∑
k
{
n
k
}
x
k
‾
x*x^{n-1}=x*\sum\limits_{k}\begin{Bmatrix}n-1\\k\end{Bmatrix}x^{\underline k}=\sum\limits_k\begin{Bmatrix}n-1\\k-1\end{Bmatrix}x^{\underline {k}}+k\begin{Bmatrix}n-1\\k\end{Bmatrix}x^{\underline k}=\sum\limits_k\begin{Bmatrix}n\\k\end{Bmatrix}x^{\underline k}
x∗xn−1=x∗k∑{n−1k}xk=k∑{n−1k−1}xk+k{n−1k}xk=k∑{nk}xk
这个公式可以理解为 n n n个不同的球放进 x x x个不同的盒子,每个盒子可以为空的方案数,右边就是在枚举把 n n n个球分成几个集合。
上升幂转常幂:
x n ‾ = ∑ k [ n k ] x k (1.2) x^{\overline n}=\sum_k\begin{bmatrix}n\\k\end{bmatrix}x^k\tag {1.2} xn=k∑[nk]xk(1.2)
因为
(
x
+
n
−
1
)
∗
x
k
=
x
k
+
1
+
(
n
−
1
)
x
k
(x+n-1)*x^k=x^{k+1}+(n-1)x^k
(x+n−1)∗xk=xk+1+(n−1)xk,所以
(
x
+
n
−
1
)
x
n
−
1
‾
=
(
x
+
n
−
1
)
∑
k
[
n
−
1
k
]
x
k
=
∑
k
[
n
k
]
x
k
(x+n-1)x^{\overline {n-1}}=(x+n-1)\sum\limits_k\begin{bmatrix}n-1\\k\end{bmatrix}x^k=\sum\limits_k\begin{bmatrix}n\\k\end{bmatrix}x^k
(x+n−1)xn−1=(x+n−1)k∑[n−1k]xk=k∑[nk]xk
第一类斯特林数(行)求法:
上面这个式子使得求 [ n k ] \begin{bmatrix}n\\k\end{bmatrix} [nk]可以用分治FFT做到 O ( n log 2 n ) O(n\log^2n) O(nlog2n),利用上升幂的性质可以用倍增FFT做到 O ( n log n ) O(n\log n) O(nlogn),详见CF960G Bandit Blues
另外的形式:
因为有恒等式
x
n
‾
=
(
−
1
)
n
(
−
x
)
n
‾
x^{\underline n}=(-1)^n(-x)^{\overline n}
xn=(−1)n(−x)n
代入
(
1.1
)
(1.1)
(1.1),两边同时乘上
(
−
1
)
n
(-1)^n
(−1)n,有
x
n
=
∑
k
{
n
k
}
(
−
1
)
n
−
k
x
k
‾
(1.3)
x^n=\sum\limits_k \begin{Bmatrix}n\\k\end{Bmatrix}(-1)^{n-k}x^{\overline k}\tag{1.3}
xn=k∑{nk}(−1)n−kxk(1.3)将
x
x
x代做
−
x
-x
−x,代入
(
1.2
)
(1.2)
(1.2),有
x
n
‾
=
∑
k
[
n
k
]
(
−
1
)
n
−
k
x
k
(1.4)
x^{\underline n}=\sum_k\begin{bmatrix}n\\k\end{bmatrix}(-1)^{n-k}x^k\tag{1.4}
xn=k∑[nk](−1)n−kxk(1.4)
具体数学上提到,当
x
x
x很大时对于幂有一个自然的排序:
x
n
‾
>
x
n
>
x
n
‾
x^{\overline n}>x^n>x^{\underline n}
xn>xn>xn
所以用“大”的幂来展开“小”的幂时,需要使用负号,即添加
(
−
1
)
n
−
k
(-1)^{n-k}
(−1)n−k
反转公式:
dalao博客1,dalao博客2
将
(
1.2
)
(1.2)
(1.2)代入
(
1.3
)
(1.3)
(1.3),得到:
x
n
=
∑
k
{
n
k
}
(
−
1
)
n
−
k
x
k
‾
=
∑
k
,
m
{
n
k
}
[
k
m
]
(
−
1
)
n
−
k
x
m
x^n=\sum_k\begin{Bmatrix}n\\k\end{Bmatrix}(-1)^{n-k}x^{\overline k}=\sum_{k,m}\begin{Bmatrix}n\\k\end{Bmatrix}\begin{bmatrix}k\\m\end{bmatrix}(-1)^{n-k}x^m
xn=k∑{nk}(−1)n−kxk=k,m∑{nk}[km](−1)n−kxm对比
x
t
x^t
xt项的系数可以得到:
∑
k
=
0
n
{
n
k
}
[
k
m
]
(
−
1
)
n
−
k
=
[
m
=
n
]
\sum_{k=0}^n\begin{Bmatrix}n\\k\end{Bmatrix}\begin{bmatrix}k\\m\end{bmatrix}(-1)^{n-k}=[m=n]
k=0∑n{nk}[km](−1)n−k=[m=n]
−
1
-1
−1的指数写成
k
−
m
k-m
k−m不影响结果(
m
=
n
m=n
m=n时无变化,
m
≠
n
m\neq n
m=n时系数为0)。
k
k
k的范围通常也写为
[
m
,
n
]
[m,n]
[m,n]
同理,将
(
1.4
)
(1.4)
(1.4)代入
(
1.1
)
(1.1)
(1.1),得到:
∑
k
=
0
n
[
n
k
]
{
k
m
}
(
−
1
)
n
−
k
=
[
m
=
n
]
\sum_{k=0}^n\begin{bmatrix}n\\k\end{bmatrix}\begin{Bmatrix}k\\m\end{Bmatrix}(-1)^{n-k}=[m=n]
k=0∑n[nk]{km}(−1)n−k=[m=n]这里是因为两个下降幂/上升幂多项式(
x
x
x变成了
x
n
‾
x^{\underline n}
xn) 对应项系数仍然应该是相等的,考虑最高次项一定相等,然后剩下的归纳即可。
斯特林反演:
f
(
n
)
=
∑
i
=
0
n
{
n
i
}
g
(
i
)
⟺
g
(
n
)
=
∑
i
=
0
n
[
n
i
]
(
−
1
)
n
−
i
f
(
i
)
f(n)=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}g(i)\Longleftrightarrow g(n)=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}(-1)^{n-i}f(i)
f(n)=i=0∑n{ni}g(i)⟺g(n)=i=0∑n[ni](−1)n−if(i)
证明:将左边代入右边,
g
(
n
)
=
∑
i
=
0
n
[
n
i
]
(
−
1
)
n
−
i
∑
j
=
0
i
{
i
j
}
g
(
j
)
=
∑
j
=
0
n
g
(
j
)
∑
i
=
j
n
[
n
i
]
{
i
j
}
(
−
1
)
n
−
i
=
∑
j
=
0
n
g
(
j
)
[
j
=
=
n
]
g(n)=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}(-1)^{n-i}\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}g(j)=\sum_{j=0}^ng(j)\sum_{i=j}^n\begin{bmatrix}n\\i\end{bmatrix}\begin{Bmatrix}i\\j\end{Bmatrix}(-1)^{n-i}=\sum_{j=0}^ng(j)[j==n]
g(n)=i=0∑n[ni](−1)n−ij=0∑i{ij}g(j)=j=0∑ng(j)i=j∑n[ni]{ij}(−1)n−i=j=0∑ng(j)[j==n]
上面这个证明与各类反演的证明是相通的。
由反转公式的对称性,交换两类斯特林数的后反演仍然成立。
另外的形式:
f
(
n
)
=
∑
i
=
n
∞
{
i
n
}
g
(
i
)
⟺
g
(
n
)
=
∑
i
=
n
∞
[
i
n
]
(
−
1
)
i
−
n
f
(
i
)
f(n)=\sum_{i=n}^\infty\begin{Bmatrix}i\\n\end{Bmatrix}g(i) \Longleftrightarrow g(n)=\sum_{i=n}^\infty\begin{bmatrix}i\\n\end{bmatrix}(-1)^{i-n}f(i)
f(n)=i=n∑∞{in}g(i)⟺g(n)=i=n∑∞[in](−1)i−nf(i)
应用:
求连通块个数为 k k k的方案数
BZOJ4671: 异或图
先求出将
n
n
n个点划分为
k
k
k个子集,不同集合之间不能连边,子集内连边任意的方案数
f
k
f_k
fk,暂且称之为“至少”有
k
k
k个连通块的方案数。
那么最终恰好有
m
m
m个连通块的方案数
g
m
g_m
gm在
f
k
f_k
fk中被算了
{
m
k
}
\begin{Bmatrix}m\\k\end{Bmatrix}
{mk}次。
即
f
k
=
∑
i
=
k
n
{
i
k
}
g
(
i
)
f_k=\sum_{i=k}^n\begin{Bmatrix}i\\k\end{Bmatrix}g(i)
fk=∑i=kn{ik}g(i)
那么
g
(
1
)
=
∑
i
=
1
n
[
i
1
]
(
−
1
)
i
−
1
f
(
i
)
=
∑
i
=
1
n
(
i
−
1
)
!
(
−
1
)
i
−
1
f
(
i
)
g(1)=\sum_{i=1}^n\begin{bmatrix}i\\1\end{bmatrix}(-1)^{i-1}f(i)=\sum_{i=1}^n(i-1)!(-1)^{i-1}f(i)
g(1)=∑i=1n[i1](−1)i−1f(i)=∑i=1n(i−1)!(−1)i−1f(i)
O ( B e l l ( n ) ) O(Bell(n)) O(Bell(n))枚举子集划分后,由每条边的是否强制不连构建异或方程组,高斯消元/线性基算出自由元个数 x x x,那么 f ( k ) = 2 s − x f(k)=2^{s-x} f(k)=2s−x,时间复杂度 O ( B e l l ( n ) ) ∗ s 2 / s 3 O(Bell(n))*s^2/s^3 O(Bell(n))∗s2/s3。这个方法可以求恰有 k k k个连通块的方案数 g ( k ) g(k) g(k).
第二类斯特林数求自然数幂和
由常幂转下降幂的公式可以得到:
∑
i
=
0
n
i
k
=
∑
i
=
0
n
∑
j
=
0
k
{
k
j
}
i
j
‾
=
∑
j
=
0
k
{
k
j
}
∑
i
=
0
n
i
j
‾
\sum_{i=0}^ni^k=\sum_{i=0}^n\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}i^{\underline j}=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\sum_{i=0}^ni^{\underline j}
i=0∑nik=i=0∑nj=0∑k{kj}ij=j=0∑k{kj}i=0∑nij
而
∑
i
=
0
n
i
j
‾
=
∑
i
=
0
n
(
i
j
)
j
!
=
(
n
+
1
j
+
1
)
j
!
\sum\limits_{i=0}^ni^{\underline j}=\sum\limits_{i=0}^n\binom ijj!=\binom {n+1}{j+1}j!
i=0∑nij=i=0∑n(ji)j!=(j+1n+1)j!,所以
∑
i
=
0
n
i
k
=
∑
j
=
0
k
{
k
j
}
(
n
+
1
j
+
1
)
j
!
=
∑
j
=
0
k
{
k
j
}
(
n
+
1
)
j
+
1
‾
j
+
1
\sum\limits_{i=0}^ni^k=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}\binom {n+1}{j+1}j!=\sum_{j=0}^k\begin{Bmatrix}k\\j\end{Bmatrix}{(n+1)^{\underline {j+1}}\over j+1}
i=0∑nik=j=0∑k{kj}(j+1n+1)j!=j=0∑k{kj}j+1(n+1)j+1
如果有逆元,就可以做到
O
(
k
2
)
O(k^2)
O(k2)求斯特林数,
O
(
k
)
O(k)
O(k)询问。没有逆元的话就只能
O
(
k
2
)
O(k^2)
O(k2)询问。