【算法专题】集合划分数(斯特林数与贝尔数)
【第二类斯特林数】
令{nm}表示把1~n划分成m个非空集合的方案数,s(1,1)=1,根据最后一个数的位置易得递推公式:
{nm}={n−1m−1}+{n−1m}∗m
特别的,s(0,1)=s(1,0)=0,s(0,0)=1且必须定义0^0=1。
例题:【CodeForces】G. Partitions 斯特林数 利用实际含义求解
考虑容斥,当集合可空时方案数为m^n。使集合空为1,则已知集合交求集合并的补集:(注意求得排列,要消序)
\begin{Bmatrix} n\\ m \end{Bmatrix}=\frac{1}{m!}\sum_{i=0}^{m}(-1)^i*\binom{m}{i}*(m-i)^n
例题:【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT 代入通项公式求解。
通项公式可以化为卷积的形式,可以O(n log n)求一行的斯特林数:
\begin{Bmatrix} n\\ m \end{Bmatrix}=\sum_{i=0}^{m}\frac{(-1)^i}{i!}*\frac{(m-i)^n}{(m-i)!}
顺便一提第一类斯特林数(作用不大),令\begin{bmatrix} n\\ m \end{bmatrix}表示把1~n划分成m个非空环的方案数,s(1,1)=1,根据最后一个数的位置易得:
\begin{bmatrix} n\\ m \end{bmatrix}=\begin{bmatrix} n-1\\ m-1 \end{bmatrix}+\begin{bmatrix} n\\ m \end{bmatrix}*(n-1)
【幂的转化】
考虑n个不同的球放入m个不同的篮子的方案数是m^n,也可以枚举非空篮子数i,转化为1~n划分成i个非空集合的方案数乘排列,即:
m^n=\sum_{i=1}^{n}\begin{Bmatrix} n\\ i \end{Bmatrix}*i!*\binom{m}{i}
这里Σ的上届应该是m,由于m^{\underline{i}}=0,i>m,所以上届可以为n(这样方便运算),后面同理。
然后发现后面部分可以化为下降幂,即:
m^n=\sum_{i=1}^{n}\begin{Bmatrix} n\\ i \end{Bmatrix}*m^{\underline{i}}
然后根据斯特林反演,还有:
m^{\underline{n}}=\sum_{i=1}^{n}(-1)^{n-i}*\begin{bmatrix} n\\ i \end{bmatrix}*m^i
顺便一提,上升幂转化为通常幂时将上面两个公式的斯特林数1和2互换之后就可以套用了。
例题:【CodeForces】932 E. Team Work 套路是通常幂转下降幂之后把斯特林数提到最前面,后面考虑处理。
这道题是后面组合数合并后转化为O(log n)计算,BZOJ2159是后面部分用变量表示,然后独立出来用树形DP做(好神奇)。
【贝尔数】
令B(n)表示将1~n划分成非空集合的方案数,B(1)=1,根据1所在的集合大小易得通项公式:
B(n)=\sum_{i=1}^{n}\binom{n-1}{i-1}*B(n-i)
贝尔数显然是第二类斯特林数的和,即:
B(n)=\sum_{i=1}^{n}\begin{Bmatrix} n\\ i \end{Bmatrix}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2017-04-05 【BZOJ】3790 神奇项链
2017-04-05 【HDU】3068 最长回文