首页 > 其他分享 >斯特林数 学习笔记

斯特林数 学习笔记

时间:2023-01-07 22:14:02浏览次数:41  
标签:begin end limits 斯特林 sum 笔记 学习 bmatrix

斯特林数

第一类斯特林数

第一类斯特林数 \(\begin{bmatrix}n\\m\end{bmatrix}\) 表示将 \(n\) 个有标号元素划分成 \(m\) 个无标号圆排列的方案数。

递推式

考虑每次新加入一个元素,它可以单独成为一个环,或者接到任意一个元素后面,有:

\[{n\brack m}={n-1\brack m-1}+(n-1){n-1\brack m} \]

恒等式

  • \(\sum\limits_{i=0}^n \begin{bmatrix}n\\i\end{bmatrix}=n!\),众所周知排列由若干个圆排列构成。
  • \(x^{\overline{n}}=\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}x^i\),上升幂转普通幂公式,这同时指出一行第一类斯特林数的 OGF 为 \(x^{\overline{n}}\)。

生成函数

从组合意义的角度推导第一类斯特林数的生成函数 \(F(x)=\sum\limits_{i\geq 0}\sum\limits_{j\geq 0}\frac{x^i}{i!}y^j\begin{bmatrix}i\\j\end{bmatrix}\),注意 \(x\) 这一维上是 EGF。

首先,单个环的生成函数是 \(y\sum\limits_{i=1}^n(i-1)!\dfrac{x^i}{i!}=-y\ln(1-x)\),多个无标号环的组合就是 \(\exp(-y\ln(1-x))=(1-x)^{-y}\)。

求一行第一类斯特林数

一行第一类斯特林数的生成函数为 \(x^{\overline{n}}\),考虑如何快速求出 \(x^{\overline{n}}\),可以分治 FFT 得到一个 \(\mathcal{O}(n\log^2 n)\) 算法,下面介绍一种 \(\mathcal{O}(n\log n)\) 的算法。

仍然考虑和分治类似的思路:倍增。考虑设 \(F_i(x)=x^{\overline{n}}\),问题有两个:

  • 根据 \(F_i(x)\) 得到 \(F_{2i}(x)\),发现 \(F_{2i}(x)=F_{i}(x)F_{i}(x+i)\),利用多项式平移做到 \(\mathcal{O}(n\log n)\)。
  • 根据 \(F_{i}(x)\) 得到 \(F_{i+1}(x)\),暴力卷上一项是线性的。

事实证明,倍增在求多项式幂上是比分治更为优秀的结构。

求一列第一类斯特林数

考虑生成函数,有 \([y^m]\exp(-y\ln(1-x))=\dfrac{(e^x-1)^m}{m!}\),使用多项式快速幂可以做到 \(\mathcal{O}(n\log n)\)。

cmd 提到了一种小常数做法,但是不想学。不过 \(\prod\limits_{i=1}^n(1-ix)\) 是 \(\prod\limits_{i=1}^n(x-i)\) 的翻转,把 DP 式子写出来转化一下定义就可以发现了。

第二类斯特林数

第二类斯特林数 \(\begin{Bmatrix}n\\m\end{Bmatrix}\) 表示将 \(n\) 个有标号元素划分成 \(m\) 个非空无标号集合的方案数。

递推式

考虑每个元素,要么加入前面的一个集合,要么新建一个集合,有:

\[{n\brace m}={n-1\brace m-1}+m{n-1\brace m} \]

对比第一类斯特林数的递推式,不同的只有后面一项的系数。

恒等式

  • \(x^{n}=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}x^{\underline{i}}\),普通幂转下降幂公式。
  • \(\begin{Bmatrix}n\\m\end{Bmatrix}m!=\sum\limits_{i=0}^m\dbinom{m}{i}(-1)^{m-i}i^n\),通项公式。可以利用容斥解释,也可以对上面二项式反演。

生成函数

从组合意义的角度推导第二类斯特林数的生成函数 \(F(x)=\sum\limits_{i\geq 0}\sum\limits_{j\geq 0}\frac{x^i}{i!}y^j\begin{Bmatrix}i\\j\end{Bmatrix}\),注意 \(x\) 这一维上是 EGF。

考虑单个集合的生成函数为 \(y(e^x-1)\),多个集合就是 \(\exp(y(e^x-1))\)。

求一行第二类斯特林数

通项公式就是卷积形式。

求一列第二类斯特林数

考虑 \([y^m]\exp(y(e^x-1))=\dfrac{(e^x-1)^m}{m!}\),使用多项式快速幂即可。

斯特林反演

有斯特林反演公式:

\[f_n=\sum_{i=0}^n{n\brack i}g_i\Leftrightarrow g_n=\sum_{i=0}^n{n\brace i}(-1)^{n-i}f_i \]

因为题目太少了,目前只知道可以钦定一些元素在一些等价类中,然后容斥。

上述式子也指出了下降幂转普通幂和普通幂转上升幂的公式:

\[x^{\underline{n}}=\sum\limits_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}(-1)^{n-i}x^i\\ x^{n}=\sum\limits_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}(-1)^{n-i}x^{\overline{i}} \]

没做过题,不会用。

习题

CF960G

考虑只有前缀最大值的限制怎么做,考虑一个 DP。设 \(f_{i,j}\) 表示前 \(i\) 个有 \(j\) 个最大值的方案数:

\[f_{i,j}=f_{i-1,j-1}+jf_{i-1,j} \]

这就是第一类斯特林数,所以有 \(a\) 个前缀最大值方案数是 \(\begin{bmatrix}n\\a\end{bmatrix}\)。

考虑原问题。发现前缀最大值和后缀最大值之间相互独立,枚举最大值位置:

\[\sum_{i=1}^n\begin{bmatrix}i-1\\a-1\end{bmatrix}\begin{bmatrix}n-i\\b-1\end{bmatrix}\binom{n-1}{i-1}=\binom{a+b-2}{a-1}\begin{bmatrix}n-1\\a+b-2\end{bmatrix} \]

组合意义不难证明。

但是发现第一类斯特林数没有通项公式,所以只能写多项式。

标签:begin,end,limits,斯特林,sum,笔记,学习,bmatrix
From: https://www.cnblogs.com/yllcm/p/17033654.html

相关文章

  • JavaScript学习笔记—使用字面量创建数组
    语法:[]//元素为数字vararr=[1,2,3,6,10];//元素可以是任意数据类型vararr2=["hello",1,true,null,undefined];//也可以是对象varobj={name:"孙悟空......
  • JavaScript学习笔记—数组length属性
    length属性返回数组的长度(数组元素的个数)。语法:数组.length/**连续的数组,可以获取数组长度(元素个数)*非连续的数组,获取数组最大索引+1*/vararr=[1,4,10];arr......
  • JavaScript学习笔记—构造函数
    执行流程:1.立刻创建一个新的对象2.将新建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象3.逐行执行函数中的代码4.将新建的对象作为返回值返回通......
  • JavaScript学习笔记—原型对象prototype
      创建的每个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象就是我们所谓的原型对象。  函数作为普通函数调用prototype没有任何作用  当函......
  • Linux笔记03: Linux常用命令_3.4文件和目录共用命令
     3.4目录和文件共用命令 3.4.1rm命令  ●命令名称:rm。  ●英文原意:removefilesordirectories。   ●所在路径:/usr/bin/rm。   ●执行权限:所......
  • 安卓应用漏洞学习-Content Provider组件的自定义权限
    前期回顾漏洞免费实战部分-安卓应用层getLastPathSegment函数问题漏洞实战部分2-安卓应用ZipEntry对象问题实战漏洞实战部分3-ContentProvider组件的openFile接口问题......
  • Docker学习使用01
    安装官网地址:https://docs.docker.com/engine/install/centos/1.卸载旧版本yumremovedocker\docker-client\docker-client-......
  • 一些学习编程的优质网站
    国外的google.com就不说了,好是好,得跳墙。http://github.com地球上最大的开源中心,项目非常丰富,从华贵绚丽的界面到低调实用的小类库,应有尽有。需要睁大眼睛慢慢挑,适合......
  • JavaScript学习笔记—声明
    (1)变量声明提前使用var关键字声明的变量,会在所有代码执行前被声明(但不会赋值)console.log("a="+a);//a已声明,但是值是undefinedvara=123;如果声明变量时不使用v......
  • JavaScript学习笔记—this的使用
      解析器调用函数时每次都会向函数传递进一个隐含的参数this,this指向的是一个对象,这个对象称为函数执行的上下文对象。  根据函数的调用方式不同,this会指向不同的对象......