贝尔数学习笔记

我们定义贝尔数\(Bn\)为:\(n\)个元素划分为任意个集合的方案数。

根据定义可以知道\(B_n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\)。根据这个式子计算单个贝尔数是\(O(nlogn)\)

贝尔数还可以通过递推式计算。假设前\(n\)个元素已经任意划分,现在加入第\(n+1\)个元素;枚举新元素与前面i个元素分为一个集合,剩下的\(n-i\)个元素任意划分,就有:

\[B_{n+1}=\sum_{i=0}^n{n\choose i}B_{n-i}=\sum_{i=0}^n{n\choose i}B_i \]

这样可以\(O(n^2)\)计算前\(n\)个贝尔数的值。

贝尔数还可以写出生成函数。设\(f_n\)为n个元素划分为一个集合的方案数,显然\(f_n=1\)。写出\(f_n\)的指数型生成函数\(F(x)\)就是:

\[F(x)=\sum_{n=1}\frac{x^n}{n!}=e^x-1 \]

那么\(n\)个数划分为i个集合的方案数就是:

\[[x^n]F^i(x) \]

枚举划分为多少个集合,那么贝尔数\(B\)的指数型生成函数\(B(x)\)就可以写成:

\[B(x)=\sum_{n=0}\frac{F^n(x)}{n!}=e^{F(x)}=e^{e^x-1} \]

使用多项式exp,就可以\(O(nlogn)\)计算前\(n\)项贝尔数的值。

我还在知乎写过贝尔数的一些性质:贝尔数满足Touchard同余

posted @ 2020-03-11 16:20  修电缆的建筑工  阅读(177)  评论(0编辑  收藏  举报