Bell数入门
贝尔数
贝尔数是以埃里克·坦普尔·贝尔命名,是组合数学中的一组整数数列,开首是(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数入门的更多相关文章
- Bell(hdu4767+矩阵+中国剩余定理+bell数+Stirling数+欧几里德)
Bell Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- Stirling数,Bell数,Catalan数,Bernoulli数
组合数学的实质还是DP,但是从通式角度处理的话有利于FFT等的实现. 首先推荐$Candy?$的球划分问题集合: http://www.cnblogs.com/candy99/p/6400735.ht ...
- Bell数和Stirling数
前面说到了Catalan数,现在来了一个Bell数和Stirling数.什么是Bell数,什么是Stirling数呢?两者的关系如何,有用于解决什么算法问题呢? Bell数是以Bell这个人命名的,组 ...
- 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 ...
- 恶补---bell数
定义 bell数即一个集合划分的数目 示例 前几项的bell数列为 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975 ,... 求值方法 1.bell ...
- (转) [组合数学] 第一类,第二类Stirling数,Bell数
一.第二类Stirling数 定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数. 证明:元素在哪些盒子并不重要,唯一重要的是各个盒子里装的 ...
- Catalan卡特兰数入门
简介 卡特兰数是组合数学中的一种常见数列 它的前几项为: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, ...
- Day9--Python--函数入门
函数神马是函数: 函数是对功能或动作的封装函数的定义: def 函数名(形参列表): #参数 函数体(return) 调用: ret = 函数名(实参列表) 函数名就是变量名: 函数名的命名规则:变量 ...
- 卡特兰(Catalan)数入门详解
也许更好的阅读体验 基本概念 介绍 学卡特兰数我觉得可能比组合数要难一点,因为组合数可以很明确的告诉你那个公式是在干什么,而卡特兰数却像是在用大量例子来解释什么时卡特兰数 这里,我对卡特兰数做一点自己 ...
随机推荐
- 22 Oracle数据库基础入门
1.Oracle数据库的介绍 ORACLE 数据库系统是美国ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体 ...
- 01-Windows Server 2012的配置与部署
一. 背景 这里以阿里云Windows Server 2012系统的服务器为主,介绍服务器的配置以及.Net程序的发布顺序,在后续的项目管理文章中,会介绍<运维手册>的写法. 二. 步骤 ...
- Python之虚拟环境virtualenv、pipreqs生成项目依赖第三方包
virtualenv简介 含义: virtual:虚拟,env:environment环境的简写,所以virtualenv就是虚拟环境,顾名思义,就是虚拟出来的一个新环境,比如我们使用的虚拟机.doc ...
- Python之路【第十五篇】开发FTP多线程程序
要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 ...
- U9单据打印模板自定义扩展字段显示名称
UBF打印模板中,单据自定义扩展字段显示均为扩展字段值集值编码,而在实际运用过程中打印时需要显示扩展字段名称,具体实现方法如下 方式一:采用SQL系统定义函数[dbo].[fn_GetSegName] ...
- Python调用Matlab2014b引擎
用惯Python的你,是不是早已无法忍受matplotlib那丑陋无比的图以及蛋疼无比部署依赖? 当当当当,Matlab2014b的Python Engine API现已加入豪华午餐. 上次写了一篇文 ...
- Drool7s kmodule的作用--系列02课
本文是介绍drool7s kmodule. 一.为什么komdule.xml文件一定要放在resources下的META-INF文件夹中 --->直接看源码吧,请看下图,应该都知道为什么要放在固 ...
- selenium中的元素操作之三大切换(二)
一.窗口切换 使用方法: 1.获取到打开的所有的窗口,句柄handles all_handles = driver.window_handles print(all_handles) 2.获取当前的窗 ...
- Implicit super constructor Array() is undefined for default constructor. Must define an explicit constructor
因为你的父类已经创建了一个带参的构造函数并且父类中没有无参的构造函数,此时编译器不会为你调用默认的构造函数, 所以子类在继承父类的时候需要在自己的构造函数中显式的调用父类的构造函数,这样才能确保子类在 ...
- 2019 网易java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.网易等公司offer,岗位是Java后端开发,因为发展原因最终选择去了网易,入职一年时间了,也成为了面试官,之 ...