贝尔数

P5748 集合划分计数

一个有 \(n\) 个元素的集合,将其分为任意个非空子集,求方案数。
注意划分出的集合间是无序的,即 \(\{\{1,2\},\{3\}\}\)\(\{\{3\},\{2,1\}\}\) 算作一种方案。

由于答案可能会很大,所以要对 \(998244353\) 取模。

多组测试数据。

先用第二类斯特林数暴力跑一下,然后去 OEIS,得知这玩意叫做贝尔数。

解这个东西有两种方法。 这里两种方法都会提一下。

解递推式法

我们想找个 \(B_n\) 的递推式出来然后尝试解它。

考虑 \(n\) 这个数所在的集合,设其大小为 \(k + 1\)

前面有 \(n - 1\) 个数,现在在其中挑选 \(k\) 个数加入新集合,其它数就与 \(n\) 无关了。

那么得到递推式:

\[B_n = \sum_{k = 0} ^ {n - 1} \binom {n - 1}{k}B_{n - k - 1} \\ B_{n + 1} = \sum_{k = 0} ^ {n} \binom {n}{k}B_{n - k} \]

\(B_i\) 看成 \(B_i \times 1\),然后这是一个可爱的二项卷积,想到 EGF。

\(B_n\) 的 EGF 为 \(A(\tau) = \sum_n B_n \frac{\tau ^ n}{\tau!}\)

啊为什么用 \(\tau\) 呢?因为 @Black_Crow 喜欢用 \(z\),我喜欢用 \(x\),折中一下用大家都喜欢的 \(\tau\)

然后根据上面的递推式,用 EGF 表示一下就得到这样的递推式:

\[A'(\tau) = A(\tau) * e^\tau \]

这是个微分方程,又因为 \(A(0) = 1\),解它得到:

\[A(\tau) = e ^{e^\tau - 1} \]

利用 EGF 中 \(\exp\) 的组合意义

扫一眼 OI Wiki 或者 Command_block 的博客,然后发现在 EGF 中 \(\exp\) 有很好的组合意义。

结论是,设 \(A\) 是一个组合元素的 EGF,则 \(\exp(A)\) 表示以 \(A\) 中元素的生成集合作为组合元素的 EGF。

证明的话直接看上面的两个资源吧,这里不写了。

那么现在我们要求的是以单个非空集合为组合元素的生成集合的方案数。

单个非空元素集合的 EGF 显然是 \(e^\tau - 1\)

把它 \(\exp\) 一下就得到了最终式子。

\[A(\tau) = e^{e^\tau - 1} \]

直接多项式 exp 即可。

posted @ 2024-06-14 19:41  AzusidNya  阅读(37)  评论(0)    收藏  举报