斯特林数 java实现_关于斯特林数
第一类斯特林数
定义
$S_1(n,m)$表示$n$个元素,形成$m$个环的方案数,记作$\begin{bmatrix}n\\m\end{bmatrix}$。
其中每个元素是不同的,每个环是相同的。
递推公式
从实际含义上去考虑,第一类斯特林数递推公式为:
$\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)*\begin{bmatrix}n-1\\m\end{bmatrix}$
分别对应形成新的环,方案数即$\begin{bmatrix}n-1\\m-1\end{bmatrix}$。
接在原来的一个环中一个元素的后面,方案数即$(n-1)*\begin{bmatrix}n-1\\m\end{bmatrix}$
一些简单性质
1.第一类斯特林数第$n$行的和为$n!$,即
$\sum \limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}=n!$
考虑$n!$,表示$n$个元素的排列。建立$i \rightarrow p_i$的置换,显然会形成若干个环。
这与第一类斯特林数在第$n$行的的一种方案是一一对应的。
2.第一类斯特林数的一个用途是用通常幂表示上升幂,有
$x^{\overline n}=\sum \limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}x^i$
证明可以通过数学归纳法。
当$n=0$,原式$x^{\overline 0}=1=x^0$显然成立。
$x^{\overline n}=\sum \limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}x^i$
设原式在$n$时成立,只要证原式在$n+1$时也成立。
左右同乘$x+n$可得,$x^{\overline n+1}=x^{\overline n}*(x+n)$
$=\sum \limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}x^i*(x+n)$
$=\sum \limits_{i=0}^{n+1} \begin{bmatrix}n+1\\i\end{bmatrix}x^i$
3.对于通常幂,显然有$x^n=(-x)^n*(-1)^n$
对于下降幂和上升幂,同样有
$x^{\overline n}=(-x)^{\underline n}*(-1)^n$
$x^{\underline n}=(-x)^{\overline n}*(-1)^n$
将该式代入$x^{\overline n}=\sum \limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}x^i$
整理可得用通常幂表示下降幂的式子
$x^{\underline n}=\sum \limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}(-1)^{n-i}x^i$
求法
对于同一行第一类斯特林数的求解,可以直接利用第二个性质。
对$x^{\overline n}$做分治$fft$即可。
这个做法的复杂度是$O(nlog^2n)$的,可以用一些做法优化到一个log,待补。
第二类斯特林数
定义
$S_2(n,m)$表示$n$个元素,形成$m$个集合的方案数,记作$\begin{Bmatrix}n\\m\end{Bmatrix}$。
其中每个元素是不同的,每个集合是相同的。
递推公式
从实际含义上去考虑,第二类斯特林数递推公式为:
$\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m*\begin{Bmatrix}n-1\\m\end{Bmatrix}$
分别对应形成新的集合,方案数即$\begin{Bmatrix}n-1\\m-1\end{Bmatrix}$。
加入任意一个已有的集合,方案数即$m*\begin{Bmatrix}n-1\\m\end{Bmatrix}$
一些简单性质
1.第二类斯特林数的一个用途是用下降幂表示通常幂,有
$x^n=\sum \limits_{i=0}^n \begin{Bmatrix}n\\i\end{Bmatrix}x^{\underline i}$
证明(1) 通过数学归纳法,与第一类斯特林数的证明类似,这里略过。
证明(2) 考虑$x^n$的实际含义,将$n$个不同元素放入$x$个不同集合中。
有$x^n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\binom{x}{i} i!$
因为第二类斯特林数中的集合是无差别的,所以最后应当乘上$i!$。
整理上式可得要证的式子,实际上这个含有组合数的公式也是有时候要化成的形式。
2.同样代入负数形式,可得用上升幂表示通常幂的形式,即
$x^n=\sum \limits_{i=0}^n \begin{Bmatrix}n\\i\end{Bmatrix}(-1)^{n-i}x^{\overline i}$。
求法
单点求解第二类斯特林数存在一种$O(n)$的容斥方法。
设共有n个不同元素,为了方便,设共有m个不同集合。
设$g_x$表示恰好$x$个集合为空的方案数。
设$f_x$表示钦定$x$个集合为空的方案数,有
$f_x=\binom{m}{x}(m-x)^n$
$f_x=\sum \limits_{i=x}^{m}\binom{i}{x}g_i$
由二项式反演得
$g_x=\sum \limits_{i=x}^{m}(-1)^{i-x}\binom{i}{x}f_i$。
代入$x=0$,可得
$\begin{Bmatrix}n\\m\end{Bmatrix}=\frac{1}{m!}*\sum \limits_{i=0}^{m}(-1)^i\binom{m}{i}(m-i)^n$
拆一拆就发现这个玩意是个卷积式,所以求同一行第二类斯特林数可以做到$O(nlogn)$。
斯特林数 java实现_关于斯特林数相关推荐
- 斯特林数 java实现_斯特林数学习笔记
定义 第一类斯特林数\(s(n,m)\)表示把\(n\)个不同元素放到\(m\)个相同圆排列里的方案数. 有转移方程: \[s(n,m)=s(n-1,m-1)+(n-1)\times s(n-1,m) ...
- 斯特林数 java实现_斯特林数 - BILL666 - 博客园
第一类斯特林数 定义 \(\left[\begin{matrix}n\\m\end{matrix}\right]\) 表示将\(n\)个带标号的元素放入\(m\)个不带标号的环的方案数 递推式 \[\ ...
- 1000以内所有同构数java算法_使用c语言求1到1000同构数的代码
使用c语言求1到1000同构数的代码 发布时间:2020-04-30 14:39:17 来源:亿速云 阅读:679 作者:小新 今天小编给大家分享的是使用c语言求1到1000同构数的代码,相信很多人都 ...
- 对称数java算法_对称数的简单实现
在百度面试题中看到这样一个题,可能比较老套了,这里为了学习,自己写了改写了个简单算法. 我们把一个数字倒着读和原数字相同的数字称之为对称数, (例如1,121,88,8998),不考虑性能,请找出1- ...
- 斐波那契数java实现_斐波那契数列Java实现[剑指offer]
描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 题解 1.递归实现 采用递归的方式进行实现时,从第n个节点向下递归时,存 ...
- 【组合数学】第一类,第二类斯特林数(Stirling),Bell数
第一类斯特林数 定理: 第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数. 证明:把上述定理叙述中的循环排列叫做圆圈 递推公式: S1(p,p)=1(p>=0),有p个 ...
- java压测请求线程数_程序员撕开京东 618 大促压测的另一面 | 原力计划
作者 | 天涯泪小武 责编 | 王晓曼 出品 | CSDN博客 前天618大促演练进行了全链路压测,在此之前刚好我的热key探测框架也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个k ...
- java 统计文本行数_统计文本文件的行数,单词书,字节数
[java]代码库import java.io.*; /** * 统计文本文件的行数,单词书,字节数 */ class WordCount { public static int words = 1; ...
- java 36 进制_数学-在Java中如何将十进制数转换为以36为底的数字?
数学-在Java中如何将十进制数转换为以36为底的数字? 如果我有一个十进制数字,如何在Java中将其转换为以36为基数? slavoj asked 2020-07-13T23:15:07Z 10个解 ...
- tb计算机存储单位_如何节省数TB的云存储
tb计算机存储单位 Whatever cloud provider a company may use, costs are always a factor that influences decis ...
最新文章
- 整理一份详细的数据预处理方法
- (转载)Nutch2 WebPage 字段解释
- C# 代码注释生成代码提示和帮助文档
- Python机器学习基础教程(一):简介
- 系统级芯片设计语言和验证语言的发展
- 权限管理----用户与角色关系
- 推荐一个字体工具:Fontmin
- PHP Error(不定时更新)
- 关于m3u8中的IV参数
- CSS的选择器(超详细!!)
- 程序员编程规范之注释
- css样式字体文本汇总
- 计算机网络谢希仁(1)
- NameError: name ‘XXX‘ is not defined
- 腾讯云函数 python_腾讯云函数添加依赖方法之官方方案
- 中兴N880S使用SuperOneClick2.1.1出现waiting device
- ES6 解构赋值学习
- 各种License介绍
- java接入短信平台源码
- asc和desc的区别
热门文章
- 小心,家中路由器发出的WiFi信号可能让你家变“透明”
- 长春甲骨文华育兴业|大数据社会的十三大具体应用场景
- 【深入浅出向】从自信息到熵、从相对熵到交叉熵,nn.CrossEntropyLoss, 交叉熵损失函数与softmax,多标签分类
- Adobe Acrobat 如何通过书签制作多级目录
- 计算机二进制祖宗是西方人?中国道教一张八卦图千年前早已解释!
- foxmail设置,服务器备份(很实用)
- 12年双11:从春雷到秋实,为复苏喝彩
- Excel使用技巧大全
- 网络翻译-利用有道接口
- Android截屏截图方法所有方法汇总(包括Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)