基本定义

第一类斯特林数:$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. 【峰回路转】Excel技巧百例 08.计算两个日期的差值

    在Excel中假设高速计算两个日期之间的差? 比如A日期为:2012/3/12   B日期为:2015/7/29  那么这两个日期之间差几年,差几个月.差多少天? 我们使用DateDif 函数来处理. ...

  2. 3720: Gty的妹子树

    3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1440  Solved: 482[Submit][Status][Disc ...

  3. Consumer Group Example

    面向kafka编程 Consumer Group Example https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Ex ...

  4. coreseek中文搜索

    coreseek的安装和使用 准备软件包 coreseek-3.2.14.tar.gz 其他汁源 coreseek中文索引-示例文件.zip sphinx配置文件详解.txt 1.安装组件 yum - ...

  5. C语言实现 操作系统 银行家算法

    /**************************************************** 银行家算法 算法思想: 1. 在多个进程中,挑选资源需求最小的进程Pmin. 可能存在多类资 ...

  6. PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析(转)

    sort() 函数用于对数组单元从低到高进行排序. rsort() 函数用于对数组单元从高到低进行排序. asort() 函数用于对数组单元从低到高进行排序并保持索引关系. arsort() 函数用于 ...

  7. [2018-11-03]2018年10月28日宁波dotnet社区活动回顾及下次活动预告

    离上次活动,有半年了,汗.之后尽量保证每月一次,以组织为主,多邀请嘉宾来分享. 本次活动不足之处 人手不足:由于活动组织事项受限于人手(目前就我一个,这次活动前后我又应邀给大红鹰学院应届生介绍dotn ...

  8. Kafka kafka.common.OffsetOutOfRangeException 问题处理

    最近公司的zk的down掉了,  storm job 重启的时候报出 kafka.common.OffsetOutOfRangeException 异常 网上查询了一些朋友的做法, 自己也看了一下代码 ...

  9. 2015 年最热门的国人开发开源软件 TOP 50

    开源中国在 2015 年得到了快速的发展,单开源软件收藏量就接近 40000 款,其中不乏优质的国产开源项目.本文从软件的收藏.下载.访问等多角度挑选出了 2015 年最热门的国产开源软件前五十名,让 ...

  10. hadoop集群的安装

    Hadoop集群安装 1.配置JDK环境和设置主机名,本地解析 JDK环境教程: http://www.cnblogs.com/wangweiwen/p/6104189.html 本地解析: vim ...