贝尔数学习笔记

我们定义贝尔数\(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!}x^n=e^{F(x)}=e^{e^x-1} \]

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

猜你喜欢

转载自www.cnblogs.com/akura/p/12463127.html