斯特林数 java实现_斯特林数学习笔记
定义
第一类斯特林数\(s(n,m)\)表示把\(n\)个不同元素放到\(m\)个相同圆排列里的方案数。
有转移方程:
\[s(n,m)=s(n-1,m-1)+(n-1)\times s(n-1,m)
\]
第二类斯特林数\(S(n,m)\)表示把\(n\)个不同元素放到\(m\)个相同集合里的方案数。
有转移方程:
\[S(n,m)=S(n-1,m-1)+m\times S(n-1,m)
\]
还有一些我自己的定义:
\(x\)的\(n\)次下降幂\(x_{(n)}=\prod_{i=0}^{n-1} (x-i)\)。
\(x\)的\(n\)次上升幂\(x^{(n)}=\prod_{i=0}^{n-1} (x+i)\)。
(只是因为我不会LaTeX写这东西而已)
求法
第一类斯特林数
求一行
有一个式子:
\[\sum_{k=0}^n s(n,k)x^k=\prod_{i=0}^{n-1}(x+i)=x^{(n)}
\]
利用数学归纳法来证明:
\[\begin{align*}
&x^{(n+1)}\\
=&(x+n)\sum_{i=0}^n s(n,i)x^i\\
=&\sum_{i=0}^{n+1}(s(n,i-1)+n\times s(n,i))x^i\\
=&\sum_{i=0}^{n+1}s(n+1,i)x^i
\end{align*}
\]
直接暴力分治FFT可以做到\(O(n\log^2 n)\),但还可以更好。
设
\[F_n(x)=\prod_{i=0}^{n-1}(x+i)=x^{(n)}
\]
由于\(F_{2n}(x)=F_n(x)F_n(x+n)\),所以求解\(F_{2n}(x)\)时,可以先求出
\[F_n(x)=\sum_{i=0}^n a_ix^i
\]
那么就有
\[\begin{align*}
F_n(x+n)&=\sum_{i=0}^n a_i(x+n)^i\\
&=\sum_{i=0}^n a_i\sum_{k=0}^i x^kn^{i-k}{i\choose k}\\
&=\sum_{k=0}^nx^k\frac{1}{k!}\sum_{i=k}^n a_i i!n^{i-k}\frac 1{(i-k)!}
\end{align*}
\]
后面显然是个卷积的形式,可以FFT求出来。
两边都有之后就可以乘在一起了。复杂度\(O(n\log n)\)。
求一列
同样是生成函数,把\(n\)个球丢进一个圆排列的方案数的质数生成函数是
\[\sum_{n>0} (n-1)!\frac{1}{n!}x^n
\]
那么丢进\(m\)个无序圆排列就是
\[\frac 1 {m!}(\sum_{n>0} (n-1)!\frac{1}{n!}x^n)^m
\]
然后多项式快速幂。
第二类斯特林数
求一行
由组合意义可得
\[n^m=\sum_{k=0}^m k!{n\choose k} S(m,k)
\]
等价于
\[n^m=\sum_{k=0}^n k!{n\choose k} S(m,k)
\]
二项式反演,得
\[k!S(m,k)=\sum_{i=0}^k i^m(-1)^{k-i}{k\choose i}
\]
(上式直接容斥也可以得到相同结果)
可以发现展开之后就是一个卷积,暴力FFT即可。
求一列
等价于分成\(m\)个集合不变,丢\(n\)个球进去,使得集合非空。
考虑\(n\)个球放入一个集合中的方案数的指数生成函数,就是
\[\sum_{n} [n\ne 0]\frac{1}{n!}x^n
\]
也就是
\[e^x-1
\]
那么\(m\)个不同集合,生成函数就是
\[(e^x-1)^m
\]
由于集合无序,所以变成
\[\frac 1 {m!}(e^x-1)^m
\]
然后可以多项式快速幂。
斯特林反演
这里丢个式子,并不打算证明qwq
\[f_n=\sum_{k=0}^n s(n,k)g_k\Leftrightarrow g_n=\sum_{k=0}^n (-1)^{n-k}S(n,k)f_k
\]
斯特林数与上升、下降、普通幂的关系
首先有上升下降幂之间的转化:
\[x^{(n)}=(-1)^n (-x)_{(n)}\\
x_{(n)}=(-1)^n(-x)^{(n)}
\]
较为显然,不证明。
然后有上面一个式子:
\[x^{(n)}=\sum_{i=0}^n s(n,i)x^i
\]
反演得到
\[x^n=\sum_{i=0}^n (-1)^{n-i}S(n,i)x^{(i)}
\]
上升和下降转化一下得到
\[x_{(n)}=\sum_{i=0}^n s(n,i)x^{i}(-1)^{n-i}
\]
把\(x\)替换为\(-x\)又可以得到
\[x^n=\sum_{i=0}^n S(n,i)x_{(i)}
\]
诸如此类……
总结一下,应该都是普通转上升/下降时用第二类,上升/下降转普通时用第一类。这也许和斯特林数最基本的定义有关。
其他一些可能有用的东西
\[S(n+1,m+1)=\sum_k{n\choose k}S(k,m)
\]
利用组合意义很容易理解。
\[s(n+1,m+1)=\sum_k s(n,k){k\choose m}
\]
这个学长不知道怎么组合意义,那我更不会了qwq
update:会了。
考虑后面的式子的意义,就是选出一些元素组成 \(m\) 个圆排列,剩下的随便搞。
那么就等价于加入一个特殊元素,分成 \(m+1\) 个圆排列,其中没有特殊元素的圆排列就是需要的 \(m\) 个圆排列,剩下的从特殊元素这里断开,可以对应到一个排列,而众所周知一个排列即可对应到任意组合的圆排列。
斯特林数 java实现_斯特林数学习笔记相关推荐
- 斯特林数 java实现_斯特林数 - BILL666 - 博客园
第一类斯特林数 定义 \(\left[\begin{matrix}n\\m\end{matrix}\right]\) 表示将\(n\)个带标号的元素放入\(m\)个不带标号的环的方案数 递推式 \[\ ...
- 对称数java算法_对称数的简单实现
在百度面试题中看到这样一个题,可能比较老套了,这里为了学习,自己写了改写了个简单算法. 我们把一个数字倒着读和原数字相同的数字称之为对称数, (例如1,121,88,8998),不考虑性能,请找出1- ...
- Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Java开发面试高频考点学习笔记(每日更新)
Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...
- Java虚拟机(JVM)学习笔记(不定时更新)
Java虚拟机(JVM)学习笔记 不少组织都曾开发过Java虚拟机: SUN公司曾经使用过3个虚拟机,Classic.Exact VM.Hotspot. 其中Hotspot虚拟机沿用至今,并已 ...
- (尚硅谷java零基础教程)学习笔记day7/8-数组
1.数组的概述 1.1 定义 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 1.2 数组的相关概念 数组名 元素 数组的索引 ...
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
最新文章
- 我应该如何道德地接近用户密码存储以便以后的明文检索?
- 频段表_VoLTE高低频段覆盖能力研究
- MySQL自定义排序函数FIELD()
- 微软工程师测试题——未来
- helloworld:一个完整的WCF案例
- Nginx通过地理位置限制访问
- notepad自动对齐html代码,notepad如何存储为html格式化
- Algorithms Part 1-Question 6- 2SUM Median-数和以及中位数问题
- 关于 iOS 证书,你必须了解的知识
- 转:Java多线程学习(吐血超详细总结)
- 趣文:如果像招聘程序员那样招聘木匠
- 微信小程序设置字体无效_小程序设置字体样式 微信小程序字体样式
- ping 不通百度问题的解决
- 《大数据时代:生活、工作与思维的大变革》:看“大数据时代预言家”的真知灼见
- 如何解决eclipse官网下载速度超慢的问题
- Vue3+TS + element-plus 项目 动态生成Icon图标
- Java开源 开源工作流
- java创建user类在哪里_java中创建对象有哪几种方式
- 【python向日葵】愿我们的生活像向日葵一样灿烂~~~
- C++编程规范(参考Google、华为)