stirling(斯特林)数相关

一.两类stirling数的定义及递推公式.

第一类stirling数:定义第一类stirling数 S 1 ( n , m ) S_1(n,m) S1(n,m)表示 n n n个有标号的球分成 m m m个无标号的非空轮换的方案数.

这里的轮换定义为旋转同构但翻转不同构,也就是说 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4 2 , 3 , 4 , 1 2,3,4,1 2,3,4,1是同一个轮换,但 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4 4 , 3 , 2 , 1 4,3,2,1 4,3,2,1不是同一个轮换.

第一类stirling数的递推公式分为两种情况转移:
1.把最后一个球单独放在一个轮换中,方案数为 S 1 ( n − 1 , m − 1 ) S_1(n-1,m-1) S1(n1,m1).
2.把最后一个球放在某个轮换的某个球之前,方案数为 ( n − 1 ) S 1 ( n − 1 , m ) (n-1)S_1(n-1,m) (n1)S1(n1,m).

那么得到第一类stirling数递推公式
S 1 ( n , m ) = S 1 ( n − 1 , m − 1 ) + ( n − 1 ) S 1 ( n − 1 , m ) S_1(n,m)=S_1(n-1,m-1)+(n-1)S_1(n-1,m) S1(n,m)=S1(n1,m1)+(n1)S1(n1,m)

第二类stirling数:定义第二类stirling数 S 2 ( n , m ) S_2(n,m) S2(n,m)表示 n n n个有标号的球分成 m m m个无标号的非空集合的方案数.

与第一类stirling数类似的,第二类stirling数的递推公式同样分为两种情况转移:
1.把最后一个球单独放在一个集合中,方案数为 S 2 ( n − 1 , m − 1 ) S_2(n-1,m-1) S2(n1,m1).
2.把最后一个球放在某个集合中,方案数为 m S 2 ( n − 1 , m ) mS_2(n-1,m) mS2(n1,m).

那么得到第二类stirling数递推公式
S 2 ( n , m ) = S 2 ( n − 1 , m − 1 ) + m S 2 ( n − 1 , m ) S_2(n,m)=S_2(n-1,m-1)+mS_2(n-1,m) S2(n,m)=S2(n1,m1)+mS2(n1,m)



二.球与盒子的问题.

球与盒子的问题指的是将 n n n个球放入 m m m个盒子的计数问题,主要根据球有无标号,盒有无标号,是否可以有空盒分为 8 8 8种情况.

接下来我们一一讨论这 8 8 8种情况的解决方案.

情况1:球无标号,盒有标号,不允许空盒.

插板法,答案为 ( n − 1 m − 1 ) \binom{n-1}{m-1} (m1n1).

情况2:球无标号,盒有标号,允许空盒.

插板法,答案为 ( n + m − 1 n ) \binom{n+m-1}{n} (nn+m1).

情况3:球无标号,盒无标号,不允许空盒.

f i , j f_{i,j} fi,j表示 i i i个球放入 j j j个盒子的方案数,分两种情况讨论:
1.每个盒子中放入一个球,方案数为 f i − j , j f_{i-j,j} fij,j.
2.将一个球放入一个盒子,方案数为 f i − 1 , j − 1 f_{i-1,j-1} fi1,j1.

综合起来就是:
f i , j = f i − j , j + f i − 1 , j − 1 f_{i,j}=f_{i-j,j}+f_{i-1,j-1} fi,j=fij,j+fi1,j1

情况4:球无标号,盒无标号,允许空盒.

与情况3类似的有:
f i , j = f i − j , j + f i , j − 1 f_{i,j}=f_{i-j,j}+f_{i,j-1} fi,j=fij,j+fi,j1

情况5:球有标号,盒有标号,允许空盒.

每个球可以放入有 m m m种选择,答案为 m n m^{n} mn.

情况6:球有标号,盒无标号,不允许空盒.

答案为第二类stirling数,即 S 2 ( n , m ) S_2(n,m) S2(n,m).

情况7:球有标号,盒无标号,允许空盒.

对第二类stirling数求和,即:
∑ i = 0 m S 2 ( n , i ) \sum_{i=0}^{m}S_2(n,i) i=0mS2(n,i)

情况8:球有标号,盒有标号,不允许空盒.

一个办法是对第二类stirling数乘上 m m m的全排列,即 m ! S 2 ( n , m ) m!S_2(n,m) m!S2(n,m).

另一种办法是利用二项式反演,设 f i f_i fi表示 n n n个有标号的球在不允许空盒的情况下放入 i i i个有标号的盒子的方案数,那么有:
m n = ∑ i = 0 m ( m i ) f i ⇔ f m = ∑ i = 0 m ( − 1 ) m − i ( m i ) i n m^{n}=\sum_{i=0}^{m}\binom{m}{i}f_i\Leftrightarrow f_m=\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^{n} mn=i=0m(im)fifm=i=0m(1)mi(im)in



三.第二类stirling数的通项公式.

f i = i ! S 2 ( n , i ) f_i=i!S_2(n,i) fi=i!S2(n,i)代入第二个式子中我们可以得到:
m ! S 2 ( n , m ) = ∑ i = 0 m ( − 1 ) m − i ( m i ) i n S 2 ( n , m ) = ∑ i = 0 m ( − 1 ) i i ! ( m − i ) n ( m − i ) ! m!S_2(n,m)=\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^{n}\\ S_2(n,m)=\sum_{i=0}^{m}\frac{(-1)^{i}}{i!}\frac{(m-i)^{n}}{(m-i)!} m!S2(n,m)=i=0m(1)mi(im)inS2(n,m)=i=0mi!(1)i(mi)!(mi)n

这是第二类stirling数通项公式.

容易看出,第二类stirling数的通项公式是一个卷积形式,利用NTT,我们可以在 O ( m ( log ⁡ n + log ⁡ m ) ) O(m(\log n+\log m)) O(m(logn+logm))的时间复杂度内求出一行第二类stirling数.


四.自然数幂和与第二类stirling数.

f i = i ! S 2 ( n , i ) f_i=i!S_2(n,i) fi=i!S2(n,i)代入第一个式子中我们可以得到:
m n = ∑ i = 0 m ( m i ) i ! S 2 ( n , i ) = ∑ i = 0 n S 2 ( n , i ) m i ‾ m^{n}=\sum_{i=0}^{m}\binom{m}{i}i!S_2(n,i)=\sum_{i=0}^{n}S_2(n,i)m^{\underline{i}}\\ mn=i=0m(im)i!S2(n,i)=i=0nS2(n,i)mi

将这个结论带入自然数幂和:
∑ i = 1 n i k = ∑ i = 1 n ∑ j = 0 i ( i j ) j ! S 2 ( k , j ) = ∑ i = 0 n i ! S 2 ( k , i ) ∑ j = i n ( j i ) = ∑ i = 0 n i ! S 2 ( k , i ) ( n + 1 i + 1 ) = ∑ i = 0 n i ! ( n + 1 ) i + 1 ‾ ( i + 1 ) ! S 2 ( k , i ) = ∑ i = 0 n ( n + 1 ) i + 1 ‾ i + 1 S 2 ( k , i ) = ∑ i = 0 k ( n + 1 ) i + 1 ‾ i + 1 S 2 ( k , i ) \sum_{i=1}^{n}i^{k}\\ =\sum_{i=1}^{n}\sum_{j=0}^{i}\binom{i}{j}j!S_2(k,j)\\ =\sum_{i=0}^{n}i!S_2(k,i)\sum_{j=i}^{n}\binom{j}{i}\\ =\sum_{i=0}^{n}i!S_2(k,i)\binom{n+1}{i+1}\\ =\sum_{i=0}^{n}i!\frac{(n+1)^{\underline{i+1}}}{(i+1)!}S_2(k,i)\\ =\sum_{i=0}^{n}\frac{(n+1)^{\underline{i+1}}}{i+1}S_2(k,i)\\ =\sum_{i=0}^{k}\frac{(n+1)^{\underline{i+1}}}{i+1}S_2(k,i) i=1nik=i=1nj=0i(ji)j!S2(k,j)=i=0ni!S2(k,i)j=in(ij)=i=0ni!S2(k,i)(i+1n+1)=i=0ni!(i+1)!(n+1)i+1S2(k,i)=i=0ni+1(n+1)i+1S2(k,i)=i=0ki+1(n+1)i+1S2(k,i)

这样就能做到 O ( k log ⁡ k ) O(k\log k) O(klogk)处理自然数幂和了.


五.Bell数.

对第二类stirling数有了更加深入的探讨后,我们再引入它的一行和Bell数.

Bell数:Bell数 B n B_n Bn定义为:
B n = ∑ i = 0 n S 2 ( n , i ) B_n=\sum_{i=0}^{n}S_2(n,i) Bn=i=0nS2(n,i)

其组合意义为将 n n n个有标号的球划分为若干个无标号的集合的方案数.

我们已经可以做到 O ( n log ⁡ n ) O(n\log n) O(nlogn)求出单个Bell数,但是这个做法用到了常数大且较为难写的NTT,并不优秀.

来试着将其写成更好计算的形式:
B n = ∑ i = 0 n S 2 ( n , i ) = ∑ i = 0 n ∑ j = 0 i ( − 1 ) j j ! ( i − j ) n ( i − j ) ! = ∑ i = 0 n ( − 1 ) i i ! ∑ j = i n ( j − i ) n ( j − i ) ! = ∑ i = 0 n ( − 1 ) i i ! ∑ j = 0 n − i j n j ! B_n=\sum_{i=0}^{n}S_2(n,i)\\ =\sum_{i=0}^{n}\sum_{j=0}^{i}\frac{(-1)^{j}}{j!}\frac{(i-j)^{n}}{(i-j)!}\\ =\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}\sum_{j=i}^{n}\frac{(j-i)^{n}}{(j-i)!}\\ =\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}\sum_{j=0}^{n-i}\frac{j^{n}}{j!} Bn=i=0nS2(n,i)=i=0nj=0ij!(1)j(ij)!(ij)n=i=0ni!(1)ij=in(ji)!(ji)n=i=0ni!(1)ij=0nij!jn

现在只需要对 j n j ! \frac{j^{n}}{j!} j!jn这个式子求前缀和,就可以直接做到 O ( n log ⁡ n ) O(n\log n) O(nlogn)求解单个Bell数了.


六.Bell数的生成函数.

这个方法可以做到 O ( n log ⁡ n ) O(n\log n) O(nlogn)求解所有 i ∈ [ 1 , n ] i\in [1,n] i[1,n]的Bell数 B i B_i Bi.

首先根据Bell数的组合意义,我们枚举最后一个数所在的集合大小,可以得到如下递推式:
B n + 1 = ∑ i = 0 n ( n i ) B n − i B_{n+1}=\sum_{i=0}^{n}\binom{n}{i}B_{n-i} Bn+1=i=0n(in)Bni

B n B_n Bn的指数型生成函数为 B ( x ) B(x) B(x),根据上式容易得到:
B ′ ( x ) = B ( x ) e x B ′ ( x ) B ( x ) = e x ∫ B ′ ( x ) B ( x ) d x = e x − 1 ln ⁡ B ( x ) = e x − 1 B ( x ) = e e x − 1 B'(x)=B(x)e^{x}\\ \frac{B'(x)}{B(x)}=e^{x}\\ \int \frac{B'(x)}{B(x)}\mathrm{d}x=e^{x}-1\\ \ln B(x)=e^{x}-1\\ B(x)=e^{e^{x}-1} B(x)=B(x)exB(x)B(x)=exB(x)B(x)dx=ex1lnB(x)=ex1B(x)=eex1

利用多项式 exp ⁡ \exp exp即可做到 O ( n log ⁡ n ) O(n\log n) O(nlogn)求解.


七.两类stirling数与三种幂.

首先,我们可以尝试得到上升幂和下降幂之间的关系:
x n ‾ = ∏ i = 0 n − 1 ( x − i ) = ( − 1 ) n ∏ i = 0 n − 1 ( − x + i ) = ( − 1 ) n ( − x ) n ‾ x n ‾ = ∏ i = 0 n − 1 ( x + i ) = ( − 1 ) n ∏ i = 0 n − 1 ( − x − i ) = ( − 1 ) n ( − x ) n ‾ x^{\underline{n}}=\prod_{i=0}^{n-1}(x-i)=(-1)^{n}\prod_{i=0}^{n-1}(-x+i)=(-1)^{n}(-x)^{\overline{n}}\\ x^{\overline{n}}=\prod_{i=0}^{n-1}(x+i)=(-1)^{n}\prod_{i=0}^{n-1}(-x-i)=(-1)^{n}(-x)^{\underline{n}} xn=i=0n1(xi)=(1)ni=0n1(x+i)=(1)n(x)nxn=i=0n1(x+i)=(1)ni=0n1(xi)=(1)n(x)n

然后,我们在上面已经得到了幂和下降幂之间的关系:
x n = ∑ i = 0 n S 2 ( n , i ) x i ‾ x^{n}=\sum_{i=0}^{n}S_2(n,i)x^{\underline{i}} xn=i=0nS2(n,i)xi

x x x换成 − x -x x,我们可以得到幂和上升幂之间的关系:
( − x ) n = ∑ i = 0 n S 2 ( n , i ) ( − x ) i ‾ ( − x ) n = ∑ i = 0 n ( − 1 ) i S 2 ( n , i ) x i ‾ x n = ∑ i = 0 n ( − 1 ) n − i S 2 ( n , i ) x i ‾ (-x)^{n}=\sum_{i=0}^{n}S_2(n,i)(-x)^{\underline{i}}\\ (-x)^{n}=\sum_{i=0}^{n}(-1)^{i}S_2(n,i)x^{\overline{i}}\\ x^{n}=\sum_{i=0}^{n}(-1)^{n-i}S_2(n,i)x^{\overline{i}} (x)n=i=0nS2(n,i)(x)i(x)n=i=0n(1)iS2(n,i)xixn=i=0n(1)niS2(n,i)xi

我们发现只有第二类stirling数为系数的关系式,于是猜想一个第一类stirling数为系数的关系式:
x n ‾ = ∑ i = 0 n S 1 ( n , i ) x i x^{\overline{n}}=\sum_{i=0}^{n}S_1(n,i)x^{i} xn=i=0nS1(n,i)xi

归纳证明后发现它是对的,于是再次将 x x x − x -x x可以得到:
x n ‾ = ∑ i = 0 n ( − 1 ) n − i S 1 ( n , i ) x i x^{\underline{n}}=\sum_{i=0}^{n}(-1)^{n-i}S_1(n,i)x^{i} xn=i=0n(1)niS1(n,i)xi

于是我们得到了在幂和上升幂、下降幂之间转化的公式.


八.stirling反演.

我们将下降幂与幂的关系式代入幂与下降幂的关系式可以得到:
x n = ∑ i = 0 n S 2 ( n , i ) x i ‾ = ∑ i = 0 n S 2 ( n , i ) ∑ j = 0 i ( − 1 ) i − j S 1 ( i , j ) x j = ∑ i = 0 n ∑ j = 0 i ( − 1 ) i − j S 2 ( n , i ) S 1 ( i , j ) x j = ∑ i = 0 n ∑ j = i n ( − 1 ) j − i S 2 ( n , j ) S 1 ( j , i ) x i x^{n}=\sum_{i=0}^{n}S_2(n,i)x^{\underline{i}}\\ =\sum_{i=0}^{n}S_2(n,i)\sum_{j=0}^{i}(-1)^{i-j}S_1(i,j)x^{j}\\ =\sum_{i=0}^{n}\sum_{j=0}^{i}(-1)^{i-j}S_2(n,i)S_1(i,j)x^{j}\\ =\sum_{i=0}^{n}\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)x^{i} xn=i=0nS2(n,i)xi=i=0nS2(n,i)j=0i(1)ijS1(i,j)xj=i=0nj=0i(1)ijS2(n,i)S1(i,j)xj=i=0nj=in(1)jiS2(n,j)S1(j,i)xi

取出其中第 i i i项:
[ n = i ] x i = ∑ j = i n ( − 1 ) j − i S 2 ( n , j ) S 1 ( j , i ) x i [n=i]x^{i}=\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)x^{i} [n=i]xi=j=in(1)jiS2(n,j)S1(j,i)xi

同时除以 x i x^{i} xi得到反转公式
[ n = i ] = ∑ j = i n ( − 1 ) j − i S 2 ( n , j ) S 1 ( j , i ) [n=i]=\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i) [n=i]=j=in(1)jiS2(n,j)S1(j,i)

于是我们猜想stirling反演
f n = ∑ i = 0 n S 2 ( n , i ) g i ⇔ g n = ∑ i = 0 n ( − 1 ) n − i S 1 ( n , i ) f i f_n=\sum_{i=0}^{n}S_2(n,i)g_i\Leftrightarrow g_n=\sum_{i=0}^{n}(-1)^{n-i}S_1(n,i)f_i\\ fn=i=0nS2(n,i)gign=i=0n(1)niS1(n,i)fi

代入验证:
f n = ∑ i = 0 n S 2 ( n , i ) g i = ∑ i = 0 n S 2 ( n , i ) ∑ j = 0 i ( − 1 ) i − j S 1 ( i , j ) f j = ∑ i = 0 n ∑ j = 0 i ( − 1 ) i − j S 2 ( n , i ) S 1 ( i , j ) f j = ∑ i = 0 n ∑ j = i n ( − 1 ) j − i S 2 ( n , j ) S 1 ( j , i ) f j = ∑ i = 0 n [ n = i ] f i = f n f_n=\sum_{i=0}^{n}S_2(n,i)g_i\\ =\sum_{i=0}^{n}S_2(n,i)\sum_{j=0}^{i}(-1)^{i-j}S_1(i,j)f_j\\ =\sum_{i=0}^{n}\sum_{j=0}^{i}(-1)^{i-j}S_2(n,i)S_1(i,j)f_j\\ =\sum_{i=0}^{n}\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)f_j\\ =\sum_{i=0}^{n}[n=i]f_i\\ =f_n fn=i=0nS2(n,i)gi=i=0nS2(n,i)j=0i(1)ijS1(i,j)fj=i=0nj=0i(1)ijS2(n,i)S1(i,j)fj=i=0nj=in(1)jiS2(n,j)S1(j,i)fj=i=0n[n=i]fi=fn

同理我们可以得到另一个反转公式stirling反演
∑ j = i n ( − 1 ) j − i S 1 ( n , j ) S 2 ( j , i ) = [ n = i ] f n = ∑ i = 0 n S 1 ( n , i ) g i ⇔ g n = ∑ i = 0 n ( − 1 ) n − i S 2 ( n , i ) f i \sum_{j=i}^{n}(-1)^{j-i}S_1(n,j)S_2(j,i)=[n=i]\\ f_n=\sum_{i=0}^{n}S_1(n,i)g_i\Leftrightarrow g_n=\sum_{i=0}^{n}(-1)^{n-i}S_2(n,i)f_i j=in(1)jiS1(n,j)S2(j,i)=[n=i]fn=i=0nS1(n,i)gign=i=0n(1)niS2(n,i)fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值