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)数入门详解
也许更好的阅读体验 基本概念 介绍 学卡特兰数我觉得可能比组合数要难一点,因为组合数可以很明确的告诉你那个公式是在干什么,而卡特兰数却像是在用大量例子来解释什么时卡特兰数 这里,我对卡特兰数做一点自己 ...
随机推荐
- python学习-30 总结
小结 1.map函数: 处理序列中的每个元素,得到结果是一个‘列表’,该‘列表’元素个数及位置与原来一样 2.filter:遍历序列中的每个元素,判断每个元素得到的布尔值,如果是True则留下来,例如 ...
- KepServerEX读写三菱PLC,车间现场测试记录,带你了解【数据采集的困境】的前世与今生
1.不了解KepServerEX 的鞋童,可以先了解一下OPC UA,OPC UA服务端.我们当前项目读写三菱PLC是自己写的类库,但我感觉调用不够方便灵活,工作之余用OPC UA方式尝试一下 2.数 ...
- (转)为什么ssh一关闭,程序就不再运行了?
ref :https://www.cnblogs.com/lomper/p/7053694.html 问题描述 当SSH远程连接到服务器上,然后运行一个程序,eg: ./test.sh, 然后把终端开 ...
- python_dict json读写文件
命令汇总: json.dumps(obj) 将python数据转化为json Indent实现缩进,ensure_ascii 是否用ascii解析 json.loads(s) 将json数据转换为py ...
- Go defer 会有性能损耗,尽量不要用?
上个月在 @polaris @轩脉刃 的全栈技术群里看到一个小伙伴问 “说 defer 在栈退出时执行,会有性能损耗,尽量不要用,这个怎么解?”. 恰好前段时间写了一篇 <深入理解 Go def ...
- Javascript判断参数类型
function (options, param) { alert(typeof options); if (typeof options == "string") { alert ...
- C# 计时程序运行时间
第一种 System.DateTime public static void SubTest() { DateTime beforeDT = System.DateTime.Now; , , , ...
- 【开发笔记】- Java中关于HashMap的元素遍历的顺序问题
今天在使用如下的方式遍历HashMap里面的元素时 for (Entry<String, String> entry : hashMap.entrySet()) { MessageForm ...
- js对象的深入理解(六)
一.对象的创建(四种模式)1.工厂模式工厂模式示例: function createPerson(name,age){ var obj = { name:name, age:age, sayName: ...
- 高阶函数-map/filter/reduce
什么样的函数叫高阶函数: 条件:1.函数接受函数作为参数 2.函数的返回值中包含函数 高阶函数之----map函数 map(func, *iterables) --> map objectnum ...