第一类斯特林数 / 第二类斯特林数 / 贝尔数 小结
第一类斯特林数
有 nnn 个不同的小球,将它们串成 mmm 条项链,有多少种不同的方案?
第一类斯特林数的表示方法为 [nm]\left[\begin{matrix}n\\m\end{matrix}\right][nm] 或 s(n,m)s(n,m)s(n,m),表示 nnn 个不同的小球串成 mmm 条项链的方案数,考虑第 nnn 个小球的位置,要么接在前面 n−1n-1n−1 个小球中的某一个的后面,要么就新开一条项链,那么递推式为:
s(n,m)=(n−1)s(n−1,m)+s(n−1,m−1)s(n,m)=(n-1)s(n-1,m)+s(n-1,m-1) s(n,m)=(n−1)s(n−1,m)+s(n−1,m−1)
用递推式来求 sss 的话时间复杂度为 O(nm)O(nm)O(nm),但是有时候我们不需要所有的 s(i,j)s(i,j)s(i,j),只需要一个特定位置的值,此时可以考虑用生成函数来优化。
转化一下上面的递推,第 iii 次选择时,有 i−1i-1i−1 种选择不创造新的项链,有 111 种选择创造一条新的项链,写成生成函数就是:
∏i=0n−1(x+i)\prod_{i=0}^{n-1} (x+i) i=0∏n−1(x+i)
此时可以用分治来解决,每一层再用 FFTFFTFFT 将左右两边的多项式乘起来。最后得到的多项式中,xmx^mxm 的系数就是 s(n,m)s(n,m)s(n,m),时间复杂度 O(nlog2n)O(n\log^2n)O(nlog2n)。
但是有些题会卡这种做法,因为存在更优秀的 O(nlogn)O(n\log n)O(nlogn) 做法。
具体参考这题。
第二类斯特林数
有 nnn 个不同的小球,放在 mmm 个相同的盒子里,每个盒子都不能为空,问有多少种方案。
这东西和上面不一样的地方就是:在同一个盒子内,不在乎小球的顺序;而上面的项链在乎。
第二类斯特林数的表示方法为{nm}\left\{\begin{matrix}n\\m\end{matrix}\right\}{nm} 或 S(n,m)S(n,m)S(n,m),类似的,表示 nnn 个不同的小球放在 mmm 个相同的盒子里的方案数。(注意,第一类是小 sss,第二类是大 SSS)。
考虑第 nnn 个小球,要么跟前面的小球放同一个盒子里,要么自己新开一个盒子:
S(n,m)=mS(n−1,m)+S(n−1,m−1)S(n,m)=mS(n-1,m)+S(n-1,m-1) S(n,m)=mS(n−1,m)+S(n−1,m−1)
此时 S(n−1,m)S(n-1,m)S(n−1,m) 的系数为 mmm,不能使用生成函数来加速了,但是可以考虑容斥。
为了方便,先假设每个盒子都不一样,最后的方案数再除以 m!m!m! 即可。
容斥的话就要考虑不合法的方案,在这里,有盒子空了就是不合法,那么显然能得到:
S(n,m)=1m!∑i=0m(−1)iCmi(m−i)nS(n,m)=\frac1 {m!}\sum_{i=0}^m (-1)^i C_m^i (m-i)^n S(n,m)=m!1i=0∑m(−1)iCmi(m−i)n
其中,iii 表示至少有 iii 个盒子为空的方案数,(−1)i(-1)^i(−1)i 是容斥系数,CmiC_m^iCmi 表示从 mmm 个盒子里选出 iii 个作为空盒子(因为我们假设了盒子都不一样,所以需要用组合数),然后 nnn 个球放在剩下的 m−im-im−i 个盒子里的方案数就是 (m−i)n(m-i)^n(m−i)n,以及最前面乘的 1m!\frac 1 {m!}m!1 就是上面所提到的。
推一下:
1m!∑i=0m(−1)im!i!(m−i)!(m−i)n=∑i=0m(−1)ii!×(m−i)n(m−i)!\begin{aligned} &~~~~\frac 1 {m!}\sum_{i=0}^m (-1)^i\frac {m!} {i!(m-i)!}(m-i)^n\\ &=\sum_{i=0}^m\frac {(-1)^i} {i!}\times \frac {(m-i)^n} {(m-i)!} \end{aligned} m!1i=0∑m(−1)ii!(m−i)!m!(m−i)n=i=0∑mi!(−1)i×(m−i)!(m−i)n
于是发现这个东西可以用 FFTFFTFFT 搞一搞,时间复杂度为 O(nlogn)O(n\log n)O(nlogn)。
斯特林数与下降幂
斯特林数和下降幂可谓是息息相关,这里就简单讲一下利用斯特林数如何做普通多项式与下降幂多项式的转化。
一般幂转下降幂
对于 xnx^nxn,有一个经典套路,考虑其组合意义,nnn 个不同的球放 xxx 个不同的盒子里的方案数,枚举一下有多少个非空的盒子:
xn=∑i=1x(xi)S(n,i)i!=∑i=1xS(n,i)xi‾x^n=\sum_{i=1}^x \binom x i S(n,i) i!=\sum_{i=1}^x S(n,i)x^{\underline i} xn=i=1∑x(ix)S(n,i)i!=i=1∑xS(n,i)xi
一般见到的里面求和的上下界其实是 000 ~ nnn,事实上不难发现这个更宽松的上下界多出来的部分全都是 000,但是有时候推式子写这个上下界推的会更舒服。
下降幂转一般幂
上面提到了,第一类斯特林数的生成函数就是个上升幂,即:
∑i=1ns(n,i)xi=∏i=0n−1(x+i)=xn‾\sum_{i=1}^n s(n,i)x^i=\prod_{i=0}^{n-1} (x+i)=x^{\overline n} i=1∑ns(n,i)xi=i=0∏n−1(x+i)=xn
假如我们将每一个 (x+i)(x+i)(x+i) 替换成 (x−i)(x-i)(x−i),那么求出来的就是下降幂了。此时左边多项式系数只需要乘以 (−1)n−i(-1)^{n-i}(−1)n−i,等式就依然成立,即:
xn‾=∑i=1n(−1)n−is(n,i)xix^{\underline n}=\sum_{i=1}^n (-1)^{n-i} s(n,i)x^i xn=i=1∑n(−1)n−is(n,i)xi
贝尔数
有 nnn 个不同的小球放在若干个相同的盒子里,问有多少种不同的方案。
显然就是第二类斯特林数的和,即 Bn=∑i=1nS(n,k)B_n=\sum_{i=1}^n S(n,k)Bn=∑i=1nS(n,k)。
同时,也能得到递推公式:Bn+1=∑i=0nCniBiB_{n+1}=\sum_{i=0}^nC_n^i B_iBn+1=∑i=0nCniBi,枚举的 iii 表示有 n−in-in−i 个球和第 n+1n+1n+1 个球在同一个盒子里,那么剩下的 iii 个就不在同一个盒子里,他们的方案数就是 BiB_iBi,然后由于球是不一样的,所以还要乘上 CniC_n^iCni 即从 nnn 个球里选 iii 个球的方案数。
考虑如何快速求出一个 BnB_nBn,将 Bn=∑i=1nS(n,k)B_n=\sum_{i=1}^nS(n,k)Bn=∑i=1nS(n,k) 展开,得到
Bn=∑i=1n∑j=0i(−1)jj!×(n−i)n(n−i)!=∑j=0n(−1)jj!∑i=jn(n−i)n(n−i)!\begin{aligned} B_n&=\sum_{i=1}^n\sum_{j=0}^i \frac {(-1)^j} {j!}\times \frac {(n-i)^n} {(n-i)!}\\ &=\sum_{j=0}^n \frac {(-1)^j} {j!}\sum_{i=j}^{n} \frac {(n-i)^n} {(n-i)!} \end{aligned} Bn=i=1∑nj=0∑ij!(−1)j×(n−i)!(n−i)n=j=0∑nj!(−1)ji=j∑n(n−i)!(n−i)n
O(nlogn)O(n\log n)O(nlogn) 预处理 (n−i)n(n−i)!\frac {(n-i)^n} {(n-i)!}(n−i)!(n−i)n 的后缀和,就可以 O(n)O(n)O(n) 求出 BnB_nBn 了。
题表
第一类斯特林数模板题:上面那题。
第二类斯特林数模板题:第二类斯特林数·行 题解
CF932E Team Work 题解
CF960G Bandit Blues 题解
[HEOI2016/TJOI2016]求和 题解
[国家集训队] Crash 的文明世界 题解
第一类斯特林数 / 第二类斯特林数 / 贝尔数 小结相关推荐
- 组合基础2 第一类斯特林数 第二类斯特林数 基础部分
记xn‾=x(x+1)(x+2)⋯(x+n−1)x^{\overline{n}}=x(x+1)(x+2)\cdots(x+n-1)xn=x(x+1)(x+2)⋯(x+n−1),xn‾=x(x−1)(x ...
- 第一类和第二类斯特林数
第一类斯特林数 第一类斯特林数定义如下: \(s_1(n,k)\)表示\(n\)个元素组成\(k\)个圆排列的方案数. 其中\(n\)个元素的圆排列定义为\(n\)个元素围成一圈的排列,两个圆排列本质 ...
- 【组合数学】第一类,第二类斯特林数(Stirling),Bell数
第一类斯特林数 定理: 第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数. 证明:把上述定理叙述中的循环排列叫做圆圈 递推公式: S1(p,p)=1(p>=0),有p个 ...
- [学习笔记]第一类/第二类斯特林数
前置知识 · 组合数学基础 · 容斥原理 · 生成函数 · FFT/NTT · 多项式exp,多项式ln,多项式快速幂,多项式平移 一些规定 · 下降幂 xn‾=∏i=1n(x−i+1)x^{\und ...
- 新疆大学(新大)OJ xju 1006: 比赛排名 第二类斯特林数+阶乘
题目链接:http://acm.xju.edu.cn/JudgeOnline/problem.php?id=1006 第二类斯特林数: 第二类Stirling数实际上是集合的一个拆分,表示将n个不同的 ...
- 第二类Stirling数(第二类斯特林数)
第二类Stirling数(第二类斯特林数) 定义 第二类Stirling数表示把nnn个不同的数划分为mmm个集合的方案数,要求不能为空集,写作S(n,m)S(n,m)S(n,m). 和第一类Stir ...
- 【组合数学】第二类斯特林数
一.定义 第二类Stirling数即:,又可记为[与第一类的表示有大小写的区别].其表示将n个不同的元素分成m个集合的方案数. 二.理解关键词句 1.集合的一个拆分(表示将n个不同的元素拆分成m个集合 ...
- BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2159 是 hydro 的 BZOJ ...
- 【BZOJ 4555】[Tjoi2016Heoi2016]求和 多项式求逆/NTT+第二类斯特林数
出处0.0 用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O( ...
最新文章
- OWASP Webgoat 安装和使用
- 解决JavaServer Faces 2.2 requires Dynamic Web Module 2.5 or newer问题
- 【Python】如何在文件夹里批量修改文件名?(0001-1000)
- Android 中基本图像绘制
- 7-3 银行排队问题之单队列多窗口服务 (25 分)
- 腾讯整治扫码点餐强制关注公众号问题
- pygame显示图片的方法_使用Sprite实现移动动画(Pygame中的精灵类)
- 大数据之-Hadoop3.x_MapReduce_全排序案例---大数据之hadoop3.x工作笔记0115
- 护航亚运|安恒信息推出“九维五星” ,并强调将全面突出“智能亚运”
- J2SE下的路径问题
- dgvHelper,xmlHelper,inputbox(仿vba),Evaluate(vba中函数应用于C#)
- 中国物联网:价值万亿美元的重大契机
- 商城项目 ------ 订单的生成功能(vue实现)
- 公司邮箱怎么申请注册?电子邮箱注册教程来了
- Java利用aspose-words将word文档转换成pdf
- 【滤镜算法】低多边形风格介绍及Matlab实现
- [JZOJ3385] [NOIP2013模拟] 黑魔法师之门 解题报告(并查集)
- IT编程自学与培训的优缺点对比!
- 你们现在都用什么软件画原型?
- 112家IT公司薪水一览表
热门文章
- 【Spring从成神到升仙系列 二】2023年再不会 IOC 源码,就要被淘汰了
- python使用json模块还需要安装吗_python json模块安装
- JAVA_SE_Day05
- R语言条件判断语句编程:使用嵌套(一串)if/else语句实现条件逻辑判断、并对指定变量进行条件赋值
- 【推荐系统】DeepFM模型分析
- MySQL数据类型之数值数据类型
- Python读取指定路径所有.txt文件,将文件内容写入.txt
- Unity游戏文件大,如何缩小游戏文件
- Collections.sort实现倒序汉字拼音排序,默认是按照正序进行汉字拼音排序MYSQL语句支持汉字排序SQL汉字排序
- java时间格式化处理