[模板] 斯特林数,性质以及求法

博客介绍了斯特林数,它与上升幂、下降幂多项式相关且用于组合问题。详细阐述了第一类斯特林数的定义、递推式及有符号表示,还介绍了第二类斯特林数的定义、递推式,给出了其 \(O(n^2)\) 递推求法,以及 \(O(n)\) 和 \(O(n \log n)\) 的快速求法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

斯特林数 (Stirling Number) 是两组数列, 其与上升幂,下降幂多项式密切相关, 也广泛用于组合问题中.

第一类斯特林数

定义

定义(无符号)第一类斯特林数, 表示 \(n\) 个有标号元素分为 \(k\) (\(k \le n\)) 个无标号环排列 (翻转算两种) 的方案数.
记做 \({n \brack k}\), 或者 \(c(n,k)\), \(|s(n,k)|\), \(\left|s_n^k\right|\).

枚举最后一个元素的位置, 容易得到递推式
\[\begin{cases} {n \brack k} = {n-1 \brack k-1} + (n-1){n-1 \brack k} & (n > 0, k < n)\\ {n \brack 0} = 0 & (n>0) \\ {n \brack n} = 1 & (n \ge 0)\\ \end{cases}\]

有符号的斯特林数可以表示为
\[ s(n,k) = (-1)^{n-k} {n\brack k}\]

它的定义是这样的:
首先定义 \(n\) 次下降幂和上升幂
\[x^{\underline n} = \frac {x!}{(x-n)!} = \prod_{i=x-n+1}^x i\]
\[x^{\overline n} = \frac {(x+n-1)!}{(x-1)!} = \prod_{i=x}^{x+n-1} i = (-1)^n (-x)^{\underline n}\]
容易发现这是一个常数项为 \(0\)\(n\) 次多项式. 那么可以定义
\[x^{\underline n} = \sum_{i=0}^n s(n,i) x^i\]
\[x^{\overline n} = \sum_{i=0}^n {n \brack i} x^i\]

求法... 待更

性质... 待更

第二类斯特林数

定义

定义第二类斯特林数, 表示 \(n\) 个有标号元素分为 \(k\) (\(k \le n\)) 个无标号非空集合的方案数.
记做 \({n \brace k}\), 或者 \(S(n,k)\).

同样的, 可以得到递推式:
\[ \begin{cases} {n \brace k} = {n-1 \brace k-1} + k{n-1 \brace k} & (n > 0, k < n)\\ {n \brace 0} = 0 & (n>0) \\ {n \brace n} = 1 & (n \ge 0)\\ \end{cases} \]

第二类斯特林数也有关于下降幂/上升幂的定义:
\[ x^{n}=\sum_{k=0}^{n}{n \brace k}x^{\underline k} \]
\[ x^{n}=\sum_{k=0}^{n}(-1)^{n-k}{n \brace k}x^{\overline k} \]

求法

我们显然有一个 \(O(n^2)\) 的递推求法.

但有时我们想求出单点的值, 或者求出 \(S(n,k), k \in \{0,1,\dotsc, n\}\) 的所有值, 那么就需要更快的算法.

\(S'(n,k)\) 表示 \(n\) 个有标号元素分为 \(k\)有标号非空集合的方案数, 显然有
\[ S'(n,k) = S(n,k) * k!\]
\(g(n,k)\) 表示 \(n\) 个有标号元素分为 \(k\)有标号可空集合的方案数, 还有
\[ g(n,k) = k^n \]

枚举非空集合的个数, 可以发现
\[ g(n,k) = \sum_{i=0}^k {k \choose i}S'(n,i) \tag{1}\]
二项式反演:
\[ S'(n,k) = \sum_{i=0}^k (-1)^{k-i} {k \choose i}g(n,i) \tag{2}\]
那么就可以求出 \(S(n,k)\):
\[ S(n,k) = \frac{S'(n,k)}{k!} \]
\[ S(n,k) = \sum_{i=0}^k (-1)^{k-i}\frac{1}{(k-i)!} \frac{i^n}{i!} \tag{3}\]

这样, 我们就可以在 \(O(n)\) 的时间复杂度内求出 \(S(n,k)\);
容易发现这是一个卷积, 直接FFT即可求出 \(S(n,k), k \in \{0,1,\dotsc, n\}\), 时间复杂度 \(O(n \log n)\).

Note a:

求出来的 \(S(n,k)\) 的表达式在 \(n < k\) 时也是正确的! 这时它的值为 \(0\).
\(n < k\) 时, \((1)\) 式可以看作
\[ g(n,k) = \sum_{i=0}^k {k \choose i}S'(n,i) = \sum_{i=0}^n {k \choose i}S'(n,i) \]
也就是说, \(S'(n,i) (n<i)\) 的值自然为0. 那么反演出来的式子自然也可以保证 \(S'(n,i) = 0(n<i)\), 即 \(S(n,i) = 0(n<i)\).

Note b:

定义 \(0^0 = 1\).

性质

...待更

转载于:https://www.cnblogs.com/ubospica/p/10912502.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值