贝尔数

贝尔数

一、贝尔数

1、定义:以基数为 \(n\) 的集合的划分方法的数目,元素两两不同,集合 \(S\) 的一个划分是定义为 \(S\) 的两两不相交的非空子集的族,而它们的并则是 \(S\)

2、例如:\(n=3\) 时,有如下几个划分:\(\left \{\left \{a,b,c \right \} \right \},\left \{\left \{a \right \},\left \{ b,c \right \} \right \},\left \{\left \{b \right \},\left \{ a,c \right \} \right \},\left \{\left \{c \right \},\left \{ a,b \right \} \right \},\left \{\left \{a \right \},\left \{ b \right \},\left \{ c \right \} \right \}\)

我们定义 \(B_n\) 表示贝尔数,其中 \(B_0=1\),因为空集也恰好有一种划分方法。

3、递推公式:\(B_{n+1}=\sum_{k=0}^{n}C_{n}^{k}B_k\)

4、我们可以发现每个贝尔数都是相应的第二类斯特林数的和,因为第二类斯特林数正好是把基数为 \(n\) 的集合划分为正好 \(k\) 个非空集的方法数目,前几项为:\(1,1,2,5,15,52,203...\)

5、贝尔三角形,用以下方法构造一个三角矩阵:

  • \(a_{1,1}=1\)

  • 对于 \(n \ge 2\),第 \(n\) 行首项等于上一行的末项,即 \(a_{n,1}=a_{n-1,n-1}\)

  • 对于 \(n,m \ge 2\),第 \(n\) 行第 \(m\) 项等于它左边和左上角两个数之和,即 \(a_{n,m}=a_{n,m-1}+a_{n-1,m-1}\)

形象化如图 \((与杨辉三角差不多)\)

\(1\)

\(1 \qquad 2\)

\(2 \qquad 3 \qquad 5\)

\(5 \qquad 7 \qquad 10 \quad \ \ 15\)

\(15 \quad \ \ 20 \quad \ \ 27 \quad \ \ 37 \quad \ \ 52\)

\(52 \quad \ \ 67 \quad \ \ 87 \quad \ \ 114 \quad 151 \quad 203\)

\(203 \quad 255 \quad 322 \quad 409 \quad 523 \quad 674 \quad 877\)

因此代码如下:

template<typename T>
struct Ber{
    static const int N = 2000;
    T B_[N + 1][N + 1];
    Ber(T p = 1e9 + 7) {
        B_[1][1] = 1;
        for (T i = 2; i <= N; i++) {
            B_[i][1] = B_[i - 1][i - 1];
            for (T j = 2; j <= i; j++) {
                B_[i][j] = (B_[i][j - 1] + B_[i - 1][j - 1]) % p;
            }
        }
    }
    
    inline T B(T n) {
		return B_[n + 1][1];
	}
};
posted @ 2024-09-09 17:59  grape_king  阅读(175)  评论(0)    收藏  举报