贝尔数
贝尔数
一、贝尔数
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];
}
};

浙公网安备 33010602011771号