斯特林数学习笔记

定义

第一类斯特林数\(s(n,m)\)表示把\(n\)个不同元素放到\(m\)个相同圆排列里的方案数。

有转移方程:
\[ s(n,m)=s(n-1,m-1)+(n-1)\times s(n-1,m) \]
第二类斯特林数\(S(n,m)\)表示把\(n\)个不同元素放到\(m\)个相同集合里的方案数。

有转移方程:
\[ S(n,m)=S(n-1,m-1)+m\times S(n-1,m) \]
还有一些我自己的定义:

\(x\)\(n\)次下降幂\(x_{(n)}=\prod_{i=0}^{n-1} (x-i)\)

\(x\)\(n\)次上升幂\(x^{(n)}=\prod_{i=0}^{n-1} (x+i)\)

(只是因为我不会LaTeX写这东西而已)

求法

第一类斯特林数

求一行

有一个式子:
\[ \sum_{k=0}^n s(n,k)x^k=\prod_{i=0}^{n-1}(x+i)=x^{(n)} \]
利用数学归纳法来证明:
\[ \begin{align*} &x^{(n+1)}\\ =&(x+n)\sum_{i=0}^n s(n,i)x^i\\ =&\sum_{i=0}^{n+1}(s(n,i-1)+n\times s(n,i))x^i\\ =&\sum_{i=0}^{n+1}s(n+1,i)x^i \end{align*} \]
直接暴力分治FFT可以做到\(O(n\log^2 n)\),但还可以更好。


\[ F_n(x)=\prod_{i=0}^{n-1}(x+i)=x^{(n)} \]
由于\(F_{2n}(x)=F_n(x)F_n(x+n)\),所以求解\(F_{2n}(x)\)时,可以先求出
\[ F_n(x)=\sum_{i=0}^n a_ix^i \]
那么就有
\[ \begin{align*} F_n(x+n)&=\sum_{i=0}^n a_i(x+n)^i\\ &=\sum_{i=0}^n a_i\sum_{k=0}^i x^kn^{i-k}{i\choose k}\\ &=\sum_{k=0}^nx^k\frac{1}{k!}\sum_{i=k}^n a_i i!n^{i-k}\frac 1{(i-k)!} \end{align*} \]

后面显然是个卷积的形式,可以FFT求出来。

两边都有之后就可以乘在一起了。复杂度\(O(n\log n)\)

求一列

同样是生成函数,把\(n\)个球丢进一个圆排列的方案数的质数生成函数是
\[ \sum_{n>0} (n-1)!\frac{1}{n!}x^n \]
那么丢进\(m\)个无序圆排列就是
\[ \frac 1 {m!}(\sum_{n>0} (n-1)!\frac{1}{n!}x^n)^m \]
然后多项式快速幂。

第二类斯特林数

求一行

由组合意义可得
\[ n^m=\sum_{k=0}^m k!{n\choose k} S(m,k) \]
等价于
\[ n^m=\sum_{k=0}^n k!{n\choose k} S(m,k) \]
二项式反演,得
\[ k!S(m,k)=\sum_{i=0}^k i^m(-1)^{k-i}{k\choose i} \]
(上式直接容斥也可以得到相同结果)

可以发现展开之后就是一个卷积,暴力FFT即可。

求一列

等价于分成\(m\)个集合不变,丢\(n\)个球进去,使得集合非空。

考虑\(n\)个球放入一个集合中的方案数的指数生成函数,就是
\[ \sum_{n} [n\ne 0]\frac{1}{n!}x^n \]
也就是
\[ e^x-1 \]
那么\(m\)个不同集合,生成函数就是
\[ (e^x-1)^m \]
由于集合无序,所以变成
\[ \frac 1 {m!}(e^x-1)^m \]
然后可以多项式快速幂。

斯特林反演

这里丢个式子,并不打算证明qwq
\[ f_n=\sum_{k=0}^n s(n,k)g_k\Leftrightarrow g_n=\sum_{k=0}^n (-1)^{n-k}S(n,k)f_k \]

斯特林数与上升、下降、普通幂的关系

首先有上升下降幂之间的转化:
\[ x^{(n)}=(-1)^n (-x)_{(n)}\\ x_{(n)}=(-1)^n(-x)^{(n)} \]
较为显然,不证明。

然后有上面一个式子:
\[ x^{(n)}=\sum_{i=0}^n s(n,i)x^i \]
反演得到
\[ x^n=\sum_{i=0}^n (-1)^{n-i}S(n,i)x^{(i)} \]
上升和下降转化一下得到
\[ x_{(n)}=\sum_{i=0}^n s(n,i)x^{i}(-1)^{n-i} \]
\(x\)替换为\(-x\)又可以得到
\[ x^n=\sum_{i=0}^n S(n,i)x_{(i)} \]
诸如此类……

总结一下,应该都是普通转上升/下降时用第二类,上升/下降转普通时用第一类。这也许和斯特林数最基本的定义有关。

其他一些可能有用的东西

\[ S(n+1,m+1)=\sum_k{n\choose k}S(k,m) \]

利用组合意义很容易理解。
\[ s(n+1,m+1)=\sum_k s(n,k){k\choose m} \]
这个学长不知道怎么组合意义,那我更不会了qwq

转载于:https://www.cnblogs.com/p-b-p-b/p/10943453.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值