第一类斯特林数
定义
s ( i , j ) s(i,j) s(i,j)表示把 i i i个物品分成 j j j个环的方案,或者记做 [ i j ] \begin{bmatrix}i\\j\end{bmatrix} [ij]
递推式
考虑第
i
i
i个物品的划分
s
(
i
,
j
)
=
s
(
i
−
1
,
j
−
1
)
+
s
(
i
−
1
,
j
)
∗
(
i
−
1
)
s(i,j)=s(i-1,j-1)+s(i-1,j)*(i-1)
s(i,j)=s(i−1,j−1)+s(i−1,j)∗(i−1)
枚举第 1 1 1个物品所在环的大小
s ( i , j ) = ∑ k = 1 n ( n − 1 k − 1 ) ( k − 1 ) ! s ( i − k , j − 1 ) s(i,j)=\sum_{k=1}^{n}{n-1\choose k-1}(k-1)!s(i-k,j-1) s(i,j)=∑k=1n(k−1n−1)(k−1)!s(i−k,j−1)
快速求 s ( n , i ) s(n,i) s(n,i)
考虑构造生成函数
F
n
=
∑
i
=
0
∞
s
(
n
,
i
)
x
i
F_n=\sum_{i=0}^{\infty}s(n,i)x^i
Fn=∑i=0∞s(n,i)xi
由递推式可得
F
n
=
x
F
n
−
1
+
(
n
−
1
)
F
(
n
−
1
)
=
(
x
+
n
−
1
)
F
(
n
−
1
)
F_n=xF_{n-1}+(n-1)F(n-1)=(x+n-1)F(n-1)
Fn=xFn−1+(n−1)F(n−1)=(x+n−1)F(n−1)
可得
F
n
=
x
n
‾
F_n=x^{\overline n}
Fn=xn
即
∑
i
=
0
n
s
(
n
,
i
)
x
i
=
x
n
‾
\sum_{i=0}^{n}s(n,i)x^i=x^{\overline n}
∑i=0ns(n,i)xi=xn
这是就是第一类斯特林数和上升幂的关系
而且也有关于下降幂,由于
x
n
‾
=
(
−
1
)
n
(
−
x
)
n
‾
x^{\underline n}=(-1)^n(-x)^{\overline n}
xn=(−1)n(−x)n
所以 ∑ i = 0 n ( − 1 ) n − i s ( n , i ) x i = x n ‾ = ( x n ) n ! \sum_{i=0}^{n}(-1)^{n-i}s(n,i)x^i=x^{\underline n}={x\choose n}n! ∑i=0n(−1)n−is(n,i)xi=xn=(nx)n!
对和上升幂的式子
分治
N
T
T
NTT
NTT可以做到
O
(
n
l
o
g
2
n
)
O(nlog^2n)
O(nlog2n)
考虑倍增
如果 n n n为奇数,递归求解 n − 1 n-1 n−1,乘一个 x + n − 1 x+n-1 x+n−1
如果
n
n
n为偶数
有
x
2
n
‾
=
x
n
‾
(
x
+
n
)
n
‾
x^{\overline {2n}}=x^{\overline n}(x+n)^{\overline n}
x2n=xn(x+n)n
假设已经求出了
x
n
‾
=
f
1
(
x
)
=
∑
i
=
0
n
a
i
x
i
x^{\overline n}=f1(x)=\sum_{i=0}^{n}a_ix^i
xn=f1(x)=∑i=0naixi
考虑如何求出
f
2
(
x
)
=
∑
i
=
0
n
a
i
(
x
+
n
)
i
f2(x)=\sum_{i=0}^n a_i(x+n)^i
f2(x)=∑i=0nai(x+n)i
f 2 ( x ) = ∑ i = 0 n a i ∑ j = 0 i x j n i − j ( i j ) f2(x)=\sum_{i=0}^{n}a_i\sum_{j=0}^{i}x^jn^{i-j}{i\choose j} f2(x)=∑i=0nai∑j=0ixjni−j(ji)
= ∑ j = 0 n x j j ! ∑ i = j n a i i ! n i − j ( i − j ) ! \ \ \ \ \ \ \ \ \ \ \ =\sum_{j=0}^{n}\frac{x^j}{j!}\sum_{i=j}^na_ii!\frac{n^{i-j}}{(i-j)!} =∑j=0nj!xj∑i=jnaii!(i−j)!ni−j
= ∑ j = 0 n x j j ! ∑ i = 0 n − j a i + j ( i + j ) ! n i i ! \ \ \ \ \ \ \ \ \ \ \ =\sum_{j=0}^{n}\frac{x^j}{j!}\sum_{i=0}^{n-j}a_{i+j}(i+j)!\frac{n^{i}}{i!} =∑j=0nj!xj∑i=0n−jai+j(i+j)!i!ni
令 A ( x ) = ∑ i = 0 n a i i ! x i , B ( x ) = ∑ i = 0 n n n − i ( n − i ) ! x i A(x)=\sum_{i=0}^n a_ii!x^i,B(x)=\sum_{i=0}^n\frac{n^{n-i}}{(n-i)!}x^i A(x)=∑i=0naii!xi,B(x)=∑i=0n(n−i)!nn−ixi
把 ( A ∗ B ) ( x ) (A*B)(x) (A∗B)(x)乘出来左移 n n n位即可
复杂度 T ( n ) = T ( n 2 ) + O ( n l o g n ) = O ( n l o g n ) T(n)=T(\frac n 2)+O(nlogn)=O(nlogn) T(n)=T(2n)+O(nlogn)=O(nlogn)
代码:
inline poly calc_s(int n){
poly res;
if(n==1){res.pb(0),res.pb(1);return res;}
if(n&1){
res=calc_s(n-1);
res.resize(n+1);
for(int i=n;i;i--)res[i]=add(res[i-1],mul(res[i],n-1));
return res;
}
int mid=n>>1;
poly a=calc_s(mid),b(mid+1),c(mid+1);
for(int i=0;i<=mid;i++)c[i]=mul(a[i],fac[i]);
for(int i=0,p=1;i<=mid;i++,Mul(p,mid))b[i]=mul(p,ifac[i]);
reverse(b.bg(),b.bg()+mid+1);
c=c*b;for(int i=0;i<=mid;i++)c[i]=mul(c[i+mid],ifac[i]);
c.resize(mid+1),res=a*c;return res;
}
例题:传送门
第二类斯特林数
定义
S ( i , j ) S(i,j) S(i,j)表示把 i i i个物品分成 j j j个集合的方案数,也记作 { n m } \begin {Bmatrix} n \\ m\end {Bmatrix} {nm}
递推式
考虑第 i i i个数的划分
S ( i , j ) = S ( i − 1 , j − 1 ) + j ∗ S ( i − 1 , j ) S(i,j)=S(i-1,j-1)+j*S(i-1,j) S(i,j)=S(i−1,j−1)+j∗S(i−1,j)
考虑第一个数所在的集合大小
S ( i , j ) = ∑ k = 1 i ( i − 1 k − 1 ) S ( i − k , j − 1 ) S(i,j)=\sum_{k=1}^{i}{i-1\choose k-1}S(i-k,j-1) S(i,j)=∑k=1i(k−1i−1)S(i−k,j−1)
快速求解 S ( n , x ) S(n,x) S(n,x)
考虑 x n x^n xn是用 x x x种颜色去染 n n n个格子,枚举最后用了几种颜色,可得
x n = ∑ i = 0 m i n ( x , n ) ( x i ) i ! S ( n , i ) x^n=\sum_{i=0}^{min(x,n)}{x\choose i}i! S(n,i) xn=∑i=0min(x,n)(ix)i!S(n,i)
实际上由于 ( i j ) {i\choose j} (ji)和 S ( i , j ) S(i,j) S(i,j)在 i < j i<j i<j的时候都为0
所以写作
x n = ∑ i = 0 n ( x i ) i ! S ( n , i ) x^n=\sum_{i=0}^{n}{x\choose i}i! S(n,i) xn=∑i=0n(ix)i!S(n,i)
和
x n = ∑ i = 0 x ( x i ) i ! S ( n , i ) x^n=\sum_{i=0}^{x}{x\choose i}i! S(n,i) xn=∑i=0x(ix)i!S(n,i)
都可以
在实际题目中可能会根据不同情况选择变量
对第二个式子二项式反演
得
x ! S ( n , x ) = ∑ i = 0 x ( − 1 ) x − i ( x i ) i n x!S(n,x)=\sum_{i=0}^x(-1)^{x-i}{x\choose i}i^n x!S(n,x)=∑i=0x(−1)x−i(ix)in
得
S ( n , x ) = ∑ i = 0 x ( − 1 ) x − i ( x − i ) ! i n i ! S(n,x)=\sum_{i=0}^x\frac{(-1)^{x-i}}{(x-i)!}\frac{i^n}{i!} S(n,x)=∑i=0x(x−i)!(−1)x−ii!in
这是一个卷积的形式, N T T NTT NTT可以 O ( n l o g n ) O(nlogn) O(nlogn)求出
poly f,g;
for(int i=0;i<=n;i++)f.pb((i&1)?mod-ifac[i]:ifac[i]);
for(int i=0;i<=n;i++)g.pb(mul(ksm(i,n),ifac[i]));
poly S=f*g;
补充一个是 s ( n , k ) = S ( − k , − n ) s(n,k)=S(-k,-n) s(n,k)=S(−k,−n)(虽然不知道这个会有什么鬼用)
斯特林反演:
∑
i
=
1
n
(
−
1
)
i
−
1
S
n
,
i
(
i
−
1
)
!
=
[
n
=
1
]
\sum_{i=1}^n(-1)^{i-1}S_{n,i}(i-1)!=[n=1]
∑i=1n(−1)i−1Sn,i(i−1)!=[n=1]
或者写作
若
f
(
n
)
=
∑
i
=
1
n
S
(
n
,
i
)
g
(
i
)
f(n)=\sum_{i=1}^nS(n,i)g(i)
f(n)=∑i=1nS(n,i)g(i)
g
(
n
)
=
∑
i
=
1
n
(
−
1
)
n
−
i
s
(
n
,
i
)
f
(
i
)
g(n)=\sum_{i=1}^n(-1)^{n-i}s(n,i)f(i)
g(n)=∑i=1n(−1)n−is(n,i)f(i)
看到一个简单清楚的证明:
设
f
n
=
∑
i
=
0
n
S
(
n
,
i
)
g
i
f_n=\sum_{i=0}^nS(n,i)g_i
fn=∑i=0nS(n,i)gi
那么写成生成函数是
f
(
x
)
=
g
(
e
x
−
1
)
f(x)=g(e^x-1)
f(x)=g(ex−1),即
[
x
n
]
f
=
∑
i
=
0
n
g
i
(
∑
j
=
1
∞
x
j
j
!
)
i
[x^n]f=\sum_{i=0}^ng_i(\sum_{j=1}^{\infty}\frac{x^j}{j!})^i
[xn]f=∑i=0ngi(∑j=1∞j!xj)i
e
x
−
1
e^x-1
ex−1是集合的
e
g
f
egf
egf,所以后面乘上
n
!
n!
n!就是
n
n
n分成
i
i
i个环的方案
=
S
(
n
,
i
)
=S(n,i)
=S(n,i)
换元得
f
(
ln
(
x
+
1
)
)
=
g
(
x
)
f(\ln(x+1))=g(x)
f(ln(x+1))=g(x)
[
x
n
]
g
=
∑
i
=
0
n
f
i
(
∑
j
=
1
∞
x
j
(
−
1
)
j
−
1
j
)
i
[x^n]g=\sum_{i=0}^nf_i(\sum_{j=1}^{\infty}\frac{x^j(-1)^{j-1}}{j})^i
[xn]g=∑i=0nfi(∑j=1∞jxj(−1)j−1)i
后面
∑
j
x
j
j
\sum_j\frac{x^j}{j}
∑jjxj是环的
e
g
f
egf
egf,不过有个
(
−
1
)
j
−
1
(-1)^{j-1}
(−1)j−1,总共是
n
n
n
可以直接得到总共一定是
(
−
1
)
n
−
i
(-1)^{n-i}
(−1)n−i,而环对应就是
s
(
n
,
i
)
s(n,i)
s(n,i)
所以得证