我们定义贝尔数(Bn)为:(n)个元素划分为任意个集合的方案数。
根据定义可以知道(B_n=sum_{i=0}^negin{Bmatrix}n\iend{Bmatrix})。根据这个式子计算单个贝尔数是(O(nlogn))的
贝尔数还可以通过递推式计算。假设前(n)个元素已经任意划分,现在加入第(n+1)个元素;枚举新元素与前面i个元素分为一个集合,剩下的(n-i)个元素任意划分,就有:
[B_{n+1}=sum_{i=0}^n{nchoose i}B_{n-i}=sum_{i=0}^n{nchoose 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同余