斯特林数

第一类斯特林数 [ 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]=(n1)[n1m]+[n1m1]

另外,每一个排列实际上与一个环排列的集合等价, 比如 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=0n[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{n1m}+{n1m1}

第二类斯特林数(行)求法:

用容斥的想法,用所有方案减去强制有 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=0m(1)k(km)(mk)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}

第二类斯特林数(列)求法:

EGF分盒子方法
推式子求公式倍增/分治NTT方法



常幂转下降幂:

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=0n{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}} xxk=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} xxn1=xk{n1k}xk=k{n1k1}xk+k{n1k}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+n1)xk=xk+1+(n1)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+n1)xn1=(x+n1)k[n1k]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)nkxk(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)nkxk(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)nk

反转公式:

dalao博客1dalao博客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)nkxk=k,m{nk}[km](1)nkxm对比 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=0n{nk}[km](1)nk=[m=n]
− 1 -1 1的指数写成 k − m k-m km不影响结果( 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=0n[nk]{km}(1)nk=[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=0n{ni}g(i)g(n)=i=0n[ni](1)nif(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=0n[ni](1)nij=0i{ij}g(j)=j=0ng(j)i=jn[ni]{ij}(1)ni=j=0ng(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)inf(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)i1f(i)=i=1n(i1)!(1)i1f(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)=2sx,时间复杂度 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=0nik=i=0nj=0k{kj}ij=j=0k{kj}i=0nij
∑ 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=0nij=i=0n(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=0nik=j=0k{kj}(j+1n+1)j!=j=0k{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)询问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值