学习总结:斯特林数( Stirling number )

基本定义

第一类斯特林数:$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} \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.

CodeForces 960G.

原文地址:https://www.cnblogs.com/TinyWong/p/10435831.html

时间: 2024-08-29 17:08:43

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

POJ 1385-Binary Stirling Numbers(判断第二类斯特林数的奇偶性)

Binary Stirling Numbers Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1430 Appoint description:  System Crawler  (2015-04-22) Description The Stirling number of the second kind S(n, m) stands

HDU 1018 Big Number 斯特林数近似n!

题目链接:点击打开链接 斯特林数:点击打开链接 题意是计算n! 的位数 即ans = log10(n!) = log10(sqrt(2πn)) + n*log10(n/e) #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <

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

计算式 \[ S(n,m)=S(n-1,m-1)+mS(n,m) \] \(S(0,0)=1,S(i,0)=0(i>0)\) 组合意义 将\(n\)个不可分辨的小球放入\(m\)个不可分辨的盒子中,且每个盒子非空 那么上面的式子就类似与\(dp\)的转移了 性质 1.\(S(n,m)=\frac{1}{m!}\sum_{i=0}^m(-1)^i\dbinom{m}{i}(m-i)^n\) 证明:考虑组合意义 先将盒子变成有序,最后除以\(m!\)即可 第二类斯特林数保障每个盒子非空,故考虑容斥,

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

第一类斯特林数 在这里我因为懒所以还是用\(S(n,m)\)表示第一类斯特林数,但一定要和第二类斯特林数区分开来 递推式 \(S(n,m)=S(n-1.m-1)+S(n-1,m)*(n-1)\) 其中\(S(0,0)=1,S(i,0)=0(i>0)\) 组合意义 \(n\)个元素组成\(m\)个圆排列的方案数 注意这里圆排列指的是两个排列经过旋转能重合的算一种方案 那么递推式就可以这样理解:对于当前的第\(n\)个元素,单独成一个圆排列有\(S(n-1,m-1)\)种方案,放在其它的圆排列中有\

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

Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1661    Accepted Submission(s): 1015 Problem Description A murder happened in the hotel. As the best detective in the town, yo

hdu 3625 第一类斯特林数

题目链接:click here Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1146    Accepted Submission(s): 689 Problem Description A murder happened in the hotel. As the best detective

HDU 4372 Count the Buildings(组合数学-斯特林数,组合数学-排列组合)

Count the Buildings Problem Description There are N buildings standing in a straight line in the City, numbered from 1 to N. The heights of all the buildings are distinct and between 1 and N. You can see F buildings when you standing in front of the

LightOJ 1326 - Race(第二类斯特林数啊 )

题目链接:http://lightoj.com/volume_showproblem.php?problem=1326 百度百科:斯特林数 ACdreamer:第一类Stirling数和第二类Stirling Disky and Sooma, two of the biggest mega minds of Bangladesh went to a far country. They ate, coded and wandered around, even in their holidays.

斯特林数、欧拉数的求和技术及应用

斯特林数和欧拉数 ??斯特林数主要处理的是将N个不同元素分成k个集合或环的个数问题,可以分为第一类斯特林数和第二类斯特林数,其中第一类斯特林数还分为有符号和无符号两种. 第一类斯特林数 ??第一类斯特林数表示的是将n个不同元素分成k个不同环的方案数,当且仅当两个环不可通过旋转得到时,则两个环不相同.表示法为: \[ \begin{bmatrix} n\\ k \end{bmatrix} \] 读作: n circle k. ??将n个不同元素分成k个不同的环有两种方式.第一种,有可能是n-1个元