贝尔数

贝尔数是以埃里克·坦普尔·贝尔命名,是组合数学中的一组整数数列,开首是(OEIS的A000110数列):

$$B_0 = 1, B_1 = 1, B_2 = 2, B_3 = 5, B_4 = 15, B_5 = 52, B_6 = 203, ...$$

$B_n$ 的含义是基数为 $n$ 的集合划分成非空集合的划分数。

例如, $B_3=5$ 是因为3个元素的集合有5种划分方法:

{{a}, {b}, {c}}
{{a}, {b, c}}
{{b}, {a, c}}
{{c}, {a, b}}
{{a, b, c}};

贝尔数有递推公式:

$$\displaystyle B_{n+1} = \sum_{k=0}^n\binom{n}{k}B_k$$

上述组合公式的证明:

可以这样来想,$B_{n+1}$ 是含有 $n+1$ 个元素集合的划分个数,考虑元素 $b_{n+1}$,

假设他被单独划分到一类,那么还剩下n个元素,这种情况下划分个数为 $\binom{n}{n}B_n$

假设他和某一个元素被划分为一类,那么还剩下n-1个元素,这种情况下划分个数为 $\binom{n}{n-1}B_{n-1}$

假设他和某两个元素被划分为一类,那么还剩下n-2个元素,这种情况下划分个数为 $\binom{n}{n-2}B_{n-2}$,

依次类推,得到了上述组合公式

它们也适合“Dobinski公式”:

$\displaystyle B_n = \frac{1}{e}\sum_{k=0}^{\infty}\frac{k^n}{k!}$

即期望值为1 的泊松分布的 $n$ 次矩。

它们也适合"Touchard同余":若 $p$ 是任意素数,那么

$$B_{p+n} = B_n + B_{n+1}$$

$$B_{p^m+n} = mB_n + B_{n+1}$$

贝尔数模素数 $p$ 的周期为:

$$T_p = \frac{p^p-1}{p-1}$$

每个贝尔数都是相应第二类斯特林数的和

$$\displaystyle B_n = \sum_{k=0}^nS(n, k)$$

因为,第二类斯特林数 $S(n, k)$ 是把基数为 $n$ 的集合划分为正好 $k$ 个非空集合的方案数。

此外,贝尔数的指数型母函数是

$$\displaystyle \sum_{n=0}^{\infty }\frac{B_n}{n!}x^n = e^{e^x-1}$$

贝尔三角形

用以下方法建构一个三角矩阵(形式类似杨辉三角形):

  • 第一行第一项为1($a_{1,1}=1$)
  • 对于 $n>1$,第 $n$ 行第一项等于第 $n-1$ 项的最后一项($a_{n,1} = a_{n-1, n-1}$)
  • 对于 $m,n>1$,第 $n$ 行第 $m$ 项等于它左边和左上两个数之和($a_{n,m} = a_{n, m-1} + a_{n-1, m-1}$)

结果如下:(OEIS:A011971

每行首项是贝尔数。每行之和是第二类Stirling数

可以利用这个三角形来求Bell数,

#include<bits/stdc++.h>
using namespace std; const int maxn = +;
const int mod = ; //周期为13
int bell[maxn], T[maxn]; void Bell(int n, int mod) //求前n项Bell数
{
bell[] = bell[] = ;
T[] = ;T[] = ;
for(int i = ;i <= n;i++)
{
T[i-] = bell[i-];
for(int j = i-;j >= ;j--) //滚动数组
T[j] = (T[j] + T[j+]) % mod;
bell[i] = T[];
}
} int main()
{
Bell(, mod);
for(int i = ;i < ;i++)
printf("%d%c", bell[i], (i+)% == ? '\n' : ' ');
}

参考链接:

1. https://zh.wikipedia.org/w/index.php?title=%E8%B4%9D%E5%B0%94%E6%95%B0

2. https://blog.csdn.net/ACdreamers/article/details/12309269

Bell数入门的更多相关文章

  1. Bell(hdu4767+矩阵+中国剩余定理+bell数+Stirling数+欧几里德)

    Bell Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  2. Stirling数,Bell数,Catalan数,Bernoulli数

    组合数学的实质还是DP,但是从通式角度处理的话有利于FFT等的实现. 首先推荐$Candy?$的球划分问题集合: http://www.cnblogs.com/candy99/p/6400735.ht ...

  3. Bell数和Stirling数

    前面说到了Catalan数,现在来了一个Bell数和Stirling数.什么是Bell数,什么是Stirling数呢?两者的关系如何,有用于解决什么算法问题呢? Bell数是以Bell这个人命名的,组 ...

  4. codeforces 569D D. Symmetric and Transitive(bell数+dp)

    题目链接: D. Symmetric and Transitive time limit per test 1.5 seconds memory limit per test 256 megabyte ...

  5. 恶补---bell数

    定义 bell数即一个集合划分的数目 示例 前几项的bell数列为 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975 ,... 求值方法 1.bell ...

  6. (转) [组合数学] 第一类,第二类Stirling数,Bell数

    一.第二类Stirling数 定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数. 证明:元素在哪些盒子并不重要,唯一重要的是各个盒子里装的 ...

  7. Catalan卡特兰数入门

    简介 卡特兰数是组合数学中的一种常见数列 它的前几项为: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, ...

  8. Day9--Python--函数入门

    函数神马是函数: 函数是对功能或动作的封装函数的定义: def 函数名(形参列表): #参数 函数体(return) 调用: ret = 函数名(实参列表) 函数名就是变量名: 函数名的命名规则:变量 ...

  9. 卡特兰(Catalan)数入门详解

    也许更好的阅读体验 基本概念 介绍 学卡特兰数我觉得可能比组合数要难一点,因为组合数可以很明确的告诉你那个公式是在干什么,而卡特兰数却像是在用大量例子来解释什么时卡特兰数 这里,我对卡特兰数做一点自己 ...

随机推荐

  1. hdu 1427 速算24点【暴力枚举】

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. 一文读懂 IPv4 到 IPv6 的过渡技术

    在介绍 IPv4 到 IPv6 过渡技术之前,我们先来简单了解一下 IPv4 和 IPv6.什么是 IPv4?IPv4 全称为 Internet Protocol version 4,它为互联网上的每 ...

  3. 「UR#5」怎样跑得更快

    「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...

  4. C# vb .net实现宝丽来效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的宝丽来效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一 ...

  5. MVC学习笔记(三)—用EF向数据库中添加数据

    1.在EFDemo文件夹中添加Controllers文件夹(用的是上一篇MVC学习笔记(二)—用EF创建数据库中的项目) 2.在Controllers文件夹下添加一个空的控制器(StudentsCon ...

  6. JS国际化网站中英文切换(理论支持所有语言)应用于h5版APP

    网页框架类APP实现国际化参考文案一 参考:https://blog.csdn.net/CSDN_LQR/article/details/78026254 另外付有自己实现的方法 本人用于H5版的AP ...

  7. Vue项目开发相关问题总结

    Vue项目开发相关问题总结 一.创建一个项目(两种方式) 1.通过CLI命令行创建,具体步骤如下: (1)Node 版本要求 Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11 ...

  8. Linux三剑客grep/sed/awk

    grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...

  9. 大数据系列文章-Hadoop基础介绍(一)

    Hadoop项目背景简介 2003-2004年,Google公开了部分GFS个Mapreduce思想的细节,以此为基础Doug Cutting等人用了2年的业余时间,实现了DFS和Mapreduce机 ...

  10. python连接mysql服务端

    python连接mysql的客户端 import pymysql # 导入模块 conn = pymysql.connect( host='127.0.0.1', # 主机模块 port=3306, ...