基本定义

第一类斯特林数:$1 \dots n$的排列中恰好有$k$个环的个数;或是,$n$元置换可分解为$k$个独立的轮换的个数。记作

$$ \begin{bmatrix} n \\ k \end{bmatrix}. $$

第二类斯特林数:将$n$个元素分成$k$个非空集合的方案数。记作

$$ \begin{Bmatrix} n \\ k \end{Bmatrix}. $$

根据定义,我们有

$$ \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix} = n!, $$

$$ \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} = B_n, $$

其中$B_n$是 Bell 数

递推关系

第一类斯特林数:考虑$\begin{bmatrix} n \\ k \end{bmatrix}$。枚举第$n$个元素,其若自成一个环,则有$\begin{bmatrix} n-1 \\ k-1 \end{bmatrix}$种方案;若其放在已有的某个环中,则有$n-1$个位置可放,于是有$(n-1)\begin{bmatrix} n-1 \\ k \end{bmatrix}$种方案。因此,

$$ \begin{bmatrix} n \\ k \end{bmatrix} = (n-1)\begin{bmatrix} n-1 \\ k \end{bmatrix} + \begin{bmatrix} n-1 \\ k-1 \end{bmatrix}. $$

第二类斯特林数:考虑$\begin{Bmatrix} n \\ k \end{Bmatrix}$。枚举第$n$个元素,若其自成一份,则有$\begin{Bmatrix} n-1 \\ k-1 \end{Bmatrix}$种方案;若其放在已有的某份,则有$k$份可选择,于是有$k\begin{Bmatrix} n-1 \\ k \end{Bmatrix}$种方案。因此,

$$ \begin{Bmatrix} n \\ k \end{Bmatrix} = k\begin{Bmatrix} n-1 \\ k \end{Bmatrix} + \begin{Bmatrix} n-1 \\ k-1 \end{Bmatrix}. $$

以上递推式,可在$O(nk)$的复杂度内求出斯特林数。

斯特林数与阶乘幂

我们定义下降幂(Falling Factorial):

$$ x^{\underline{n}} = x(x-1)\cdots (x-n+1). $$

以及上升幂(Rising Factorial):

$$ x^{\overline{n}} = x(x+1)\cdots (x+n-1). $$

则有以下等式:

$$
\begin{aligned}
x^{\underline{n}} = \sum_{k=0}^n (-1)^{n-k} \begin{bmatrix} n \\ k \end{bmatrix} x^k  & \Longleftrightarrow x^n = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\underline{k}} \\
x^{\overline{n}} = \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix} x^k  & \Longleftrightarrow x^n = \sum_{k=0}^n (-1)^{n-k} \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\overline{k}} \\
x^{\overline{n}} = \sum_{k=0}^n L(n, k) x^{\underline{k}}  & \Longleftrightarrow x^{\underline{n}} = \sum_{k=0}^n (-1)^{n-k} L(n, k) x^{\overline{k}} 
\end{aligned}
$$

其中

$$ L(n, k) = \sum_j \begin{bmatrix} n \\ j \end{bmatrix} \begin{Bmatrix} j \\ k \end{Bmatrix} = \binom{n-1}{k-1} \frac {n!} {k!}. $$

注:最常用的是将$x^n$分成若干个$x^{\underline{k}}$之和,或者是$\binom{x}{k}$之和,即

$$ x^n = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\underline{k}} = \sum_{k=0}^n k! \begin{Bmatrix} n \\ k \end{Bmatrix} \binom{x}{k}. $$

斯特林反演

斯特林数和阶乘幂的关系可推广至一般函数:

$$
\begin{aligned}
g(n) = \sum_{k=0}^n (-1)^{n-k} \begin{bmatrix} n \\ k \end{bmatrix} f(k)  & \Longleftrightarrow f(n) = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} g(k) \\
g(n) = \sum_{k=0}^n L(n, k) f(k) & \Longleftrightarrow f(n) = \sum_{k=0}^n (-1)^{n-k} L(n, k) g(k) 
\end{aligned}
$$

斯特林数的快速求解

第一类斯特林数

为快速计算$\begin{bmatrix} n \\ k \end{bmatrix}$,我们利用

$$ x^{\overline{n}} = \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix} x^k. $$

令$f(x) = x^{\overline{n}}, g(x) = (x+n)^{\overline{n}}$,则$f(x)g(x) = x^{\overline{2n}}$。注意到$f(x)$中$x^k$的系数对应了$\begin{bmatrix} n \\ k \end{bmatrix}$。若求得了$g(x)$,计算$f(x)$与$g(x)$的多项式乘积即可得到$\begin{bmatrix} 2n \\ \cdot \end{bmatrix}$。而求$g(x)$的方法如下:

$$ f(x) = \sum_{k=0}^n a_k x^k, $$

$$
\begin{aligned}
g(x)
& = \sum_{k=0}^n a_k (x+n)^k \\
& = \sum_{k=0}^n a_k \sum_{i=0}^k \binom{k}{i} n^{k-i} x^i \\
& = \sum_{k=0}^n \frac{1} {(n-k)!} x^{n-k} \sum_{i+j=k} \frac{n^i}{i!} a_{n-j} (n-j)!
\end{aligned}
$$

就变成了卷积计算。用快速傅里叶变换则计算$g(x)$的时间复杂度为$O(n \log n)$。

总的时间复杂度为

$$ T(n) = T(n/2)+O(n\log n), $$

解为$T(n) = O(n \log n)$。

第二类斯特林数

我们仍可用第一类斯特林数的做法并利用

$$ x^n = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\underline{k}}. $$

但我们有一个更好的选择:

$$ \begin{Bmatrix} n \\ k \end{Bmatrix} = \frac 1 {k!} \sum_{i=0}^k (-1)^{k-i} \binom{k}{i} i^n = \sum_{i+j=k} \frac{i^n}{i!} \frac{(-1)^j}{j!}. $$

就变成了卷积计算,用快速傅里叶变换则时间复杂度为$O(n \log n)$。

一些例题

CodeForces 932E. Team Work

HDU 4625. JZPTREE

CodeForces 1097G. Vladislav and a Great Legend

CodeForces 960G. Bandit Blues

学习总结:斯特林数( Stirling number )的更多相关文章

  1. 【算法】第二类斯特林数Stirling

    第二类Stirling数实际上是集合的一个拆分,表示将n个不同的元素拆分成m个集合的方案数,记为 或者 . 第二类Stirling数的推导和第一类Stirling数类似,可以从定义出发考虑第n+1个元 ...

  2. 斯特林数(Stirling number)

    在组合数学,Stirling 数可指两类数,第一类Stirling 数和第二类 Stirling 数,都是由18世纪数学家 James Stirling 提出的. Stirling 数有两种,第一类和 ...

  3. poj 1430 Binary Stirling Number 求斯特林数奇偶性 数形结合| 斯特林数奇偶性与组合数的关系+lucas定理 好题

    题目大意 求子集斯特林数\(\left\{\begin{matrix}n\\m\end{matrix}\right\}\%2\) 方法1 数形结合 推荐一篇超棒的博客by Sdchr 就是根据斯特林的 ...

  4. 特殊计数序列——第一类斯特林(stirling)数

    第一类斯特林数 在这里我因为懒所以还是用\(S(n,m)\)表示第一类斯特林数,但一定要和第二类斯特林数区分开来 递推式 \(S(n,m)=S(n-1.m-1)+S(n-1,m)*(n-1)\) 其中 ...

  5. 特殊计数序列——第二类斯特林(stirling)数

    计算式 \[ S(n,m)=S(n-1,m-1)+mS(n,m) \] \(S(0,0)=1,S(i,0)=0(i>0)\) 组合意义 将\(n\)个不可分辨的小球放入\(m\)个不可分辨的盒子 ...

  6. 【poj1430】Binary Stirling Numbers(斯特林数+组合数)

    传送门 题意: 求\(S(n,m)\% 2\)的值,\(n,m\leq 10^9\),其中\(S(n,m)\)是指第二类斯特林数. 思路: 因为只需要关注奇偶性,所以递推式可以写为: 若\(m\)为偶 ...

  7. 【HDU 4372】 Count the Buildings (第一类斯特林数)

    Count the Buildings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  8. HDU2643(SummerTrainingDay05-P 第二类斯特林数)

    Rank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU3625(SummerTrainingDay05-N 第一类斯特林数)

    Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

随机推荐

  1. mysql 5.5主从复制配置

    首先将主库现有的要实现主从的数据库原原本本地复制到从库上,目的是一开始就让主从同步,让binlog日志从最新的记录开始同步! 备份: 方法1:快捷导出所要的库如(库goods)[注意:该方法仅适合My ...

  2. python 基础 4.3 高阶函数下和匿名函数

    一 .匿名函数 顾名思议就是没有名字的函数,那为什么要设立匿名函数,他有什么作用呢?lambda 函数就是一种快速定义单行的最小函数,可以用在任何需要函数的地方.   常规版: def fun(x,y ...

  3. django url匹配过程

    ROOT_URLCONF root URLconf module urlpatterns “include” other URLconf modules chops off whatever part ...

  4. iframe式ajax调用

    1.新建 a.html <!doctype html> <html> <head> <meta charset='utf-8'> <title&g ...

  5. 我的Android进阶之旅------>Android通过使用Matrix旋转图片来模拟碟片加载过程

    今天实现了一个模拟碟片加载过程的小demo,在此展示一下.由于在公司,不好截取动态图片,因此就在这截取两张静态图片看看效果先. 下面简单的将代码列出来. setp1.准备两张用于旋转的图片,如下:lo ...

  6. .net编程扫盲(*)

    http://www.cnblogs.com/edisonchou/p/4787775.html

  7. Java多线程系列 基础篇09 Object.wait/notifyJVM源码实现

    转载 https://www.jianshu.com/p/f4454164c017 作者 占小狼 最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提供一个稳定的基础,Object作为java ...

  8. mybatis中xml字段空判断及模糊查询

    由于业务特殊的查询需求,需要下面的这种查询,一直感觉模糊不清,本地测试一下顺便做个总结 贴一段xml代码,如下: <if test="receivedName != null and ...

  9. TCP/IP协议数据包文件PCAP分析器

    一.设计原理 1.PCAP文件构成 参考http://blog.csdn.net/gulu_gulu_jp/article/details/50494909 PCAP文件由一个PCAP文件头和多个PC ...

  10. Spark- Linux下安装Spark

    Spark- Linux下安装Spark 前期部署 1.JDK安装,配置PATH 可以参考之前配置hadoop等配置 2.下载spark-1.6.1-bin-hadoop2.6.tgz,并上传到服务器 ...