知识点 - Stirling数

2023-11-21 11:11
文章标签 知识点 stirling

本文主要是介绍知识点 - Stirling数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

知识点 - Stirling数

解决问题类型:

  1. 将p个物体排成k个圆排列(非空循环排列)的方法数。
  2. 从左往右会依次遇到A个比当前遇到的最大值更大的元素的排列的个数。(等价于上面的问题)
  3. 表示将n个不同的元素拆分成k个集合的方案数。
  4. 求泰勒展开系数
  5. 每条边的长度为1,对每个节点u,求 E u = ∑ v = 1 n ( d ( u , v ) ) k , E_u = \sum_{v=1}^n (d(u, v))^k, Eu=v=1n(d(u,v))k,
  6. 从n≤1e9个人中选取一个非空子集X,求所有可能的子集大小的次方之和即 ∣ X ∣ k |X|^k Xk,k≤5000(也可以二项式求导)

定义与结论:

第一类Stirling数

  1. 多项式 [ x ] n = x ( x − 1 ) ( x − 2 ) ⋅ ⋅ ⋅ ( x − n + 1 ) \left\lbrack x \right\rbrack_{n} = x\left( x - 1 \right)\left( x - 2 \right) \cdot \cdot \cdot \left( x - n + 1 \right) [x]n=x(x1)(x2)(xn+1)中常数项和 x , x 2 , x 3 , ⋅ ⋅ ⋅ , x n x,x^{2},x^{3}, \cdot \cdot \cdot ,x^{n} x,x2,x3,,xn的系数称为带符号第一类Stirling数,记为 S s ( n , k ) , k = 0 , 2 , ⋅ ⋅ ⋅ , n S_{s}\left( n,k \right),k = 0,2, \cdot \cdot \cdot ,n Ss(n,k),k=0,2,,n. 或 [ n k ] . \begin{bmatrix} n \\ k \end{bmatrix}. [nk].

    相对的无符号的第一类Stirling数,记为 S u ( n , k ) S_{u}\left( n,k \right) Su(n,k).对应 [ x ] n = x ( x + 1 ) ( x + 2 ) ⋅ ⋅ ⋅ ( x + n − 1 ) \left\lbrack x \right\rbrack_{n} = x\left( x + 1 \right)\left( x + 2 \right) \cdot \cdot \cdot \left( x + n - 1 \right) [x]n=x(x+1)(x+2)(x+n1)

  2. S s S_s Ss满足递归关系
    { S 1 ( n + 1 , k ) = S 1 ( n , k − 1 ) + n S 1 ( n , k ) , n ≥ 0 , k > 0 S 1 ( n , n ) = 1 , S 1 ( n , 0 ) = 0 \left\{ \begin{matrix} S_{1}\left( n + 1,k \right) = S_{1}\left( n,k - 1 \right) + nS_{1}\left( n,k \right),n \geq 0,k > 0 \\ S_{1}\left( n,n \right) = 1,S_{1}\left( n,0 \right) = 0 \\ \end{matrix} \right. {S1(n+1,k)=S1(n,k1)+nS1(n,k),n0,k>0S1(n,n)=1,S1(n,0)=0

    $S_u$满足递归关系
    { S 1 ( n + 1 , k ) = S 1 ( n , k − 1 ) − n S 1 ( n , k ) , n ≥ 0 , k > 0 S 1 ( n , n ) = 1 , S 1 ( n , 0 ) = 0 \left\{ \begin{matrix} S_{1}\left( n + 1,k \right) = S_{1}\left( n,k - 1 \right) - nS_{1}\left( n,k \right),n \geq 0,k > 0 \\ S_{1}\left( n,n \right) = 1,S_{1}\left( n,0 \right) = 0 \\ \end{matrix} \right. {S1(n+1,k)=S1(n,k1)nS1(n,k),n0,k>0S1(n,n)=1,S1(n,0)=0

  3. S u ( p , k ) S_u(p,k) Su(p,k)的一个的组合学解释是:将p个物体排成k个圆排列(非空循环排列)的方法数。

    考虑第n+1个物品,如果它单独构成一个圆排列有 S 1 ( n , k − 1 ) S_1(n,k-1) S1(n,k1)个方案,插入任意元素的左边有 n S 1 ( n , k ) nS_1(n,k) nS1(n,k)个方案。

  4. ∑ k = 0 n [ n k ] = n ! , \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix} = n!, k=0n[nk]=n!,

s[0][0]=1;
for (register int i=1;i<maxn;++i) {for (register int j=1;j<=i;++j) {s[i][j]=(s[i-1][j-1]+((i-1)*s[i-1][j])%q)%q;}}

第二类Stirling数

  1. 多项式 [ x ] n = x ( x − 1 ) ( x − 2 ) ⋅ ⋅ ⋅ ( x − n + 1 ) \left\lbrack x \right\rbrack_{n} = x\left( x - 1 \right)\left( x - 2 \right) \cdot \cdot \cdot \left( x - n + 1 \right) [x]n=x(x1)(x2)(xn+1) x n = ∑ k = 0 n S 2 ( n , k ) [ x ] k x^{n} = \sum_{k = 0}^{n}{S_{2}\left( n,k \right)\left\lbrack x \right\rbrack_{k}} xn=k=0nS2(n,k)[x]k,称 S 2 ( n , k ) S_{2}\left( n,k \right) S2(n,k)为第二类Stirling数。记为 { n k } . \begin{Bmatrix} n \\ k \end{Bmatrix}. {nk}.

  2. ​ 组合学解释是:表示将n个不同的元素拆分成k个集合的方案数。

  3. 第二类Stirling数满足 S 2 ( n , k ) = 1 k ! ∑ i = 0 k − 1 ( − 1 ) i C k i ( k − i ) n S_{2}\left( n,k \right) = \frac{1}{k!}\sum_{i = 0}^{k - 1}{\left( - 1 \right)^{i}C_{k}^{i}\left( k - i \right)^{n}} S2(n,k)=k!1i=0k1(1)iCki(ki)n

  4. 第二类Stirling数满足递归关系
    { S 2 ( n + 1 , k ) = S 2 ( n , k − 1 ) + k S 2 ( n , k ) , n ≥ 0 , k ≥ 1 S 2 ( 0 , 0 ) = 1 , S 2 ( n , 0 ) = 0 \left\{ \begin{matrix} S_{2}\left( n+1,k \right) = S_{2}\left( n,k - 1 \right) + kS_{2}\left( n,k \right),n \geq 0,k \geq 1 \\ S_{2}\left( 0,0 \right) = 1,S_{2}\left( n,0 \right) = 0 \\ \end{matrix} \right. {S2(n+1,k)=S2(n,k1)+kS2(n,k),n0,k1S2(0,0)=1,S2(n,0)=0
    $$

  5. 第二类Stirling数可以用卷积的方法求,根据(2)得 S 2 ( n , k ) = ∑ i = 0 k − 1 ( − 1 ) i i ! ( k − i ) n ( k − i ) ! S_2(n,k)=\sum_{i=0}^{k-1}\frac{(-1)^i}{i!}\frac{(k-i)^n}{(k-i)!} S2(n,k)=i=0k1i!(1)i(ki)!(ki)n ,对 a i = ( − 1 ) i i ! a_i=\frac{(-1)^i}{i!} ai=i!(1)i b i = i n i ! b_i=\frac{i^n}{i!} bi=i!in 卷积即可

  6. ∑ k = 0 n { n k } = B n , \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} = B_n, k=0n{nk}=Bn,

    其中Bn是 Bell 数。

斯特林数与阶乘幂

我们定义下降幂(Falling Factorial):
x n ‾ = x ( x − 1 ) ⋯ ( x − n + 1 ) . x^{\underline{n}} = x(x-1)\cdots (x-n+1). xn=x(x1)(xn+1).
以及上升幂(Rising Factorial):
x n ‾ = x ( x + 1 ) ⋯ ( x + n − 1 ) . x^{\overline{n}} = x(x+1)\cdots (x+n-1). xn=x(x+1)(x+n1).
则有以下等式,即上面的定义:
x n ‾ = ∑ k = 0 n ( − 1 ) n − k [ n k ] x k ⟺ x n = ∑ k = 0 n { n k } x k ‾ x n ‾ = ∑ k = 0 n [ n k ] x k ⟺ x n = ∑ k = 0 n ( − 1 ) n − k { n k } x k ‾ x n ‾ = ∑ k = 0 n L ( n , k ) x k ‾ ⟺ x n ‾ = ∑ k = 0 n ( − 1 ) n − k L ( n , k ) x k ‾ \begin{aligned} x^{\underline{n}} = \sum_{k=0}^n (-1)^{n-k} \begin{bmatrix} n \\ k \end{bmatrix} x^k &amp; \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 &amp; \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}} &amp; \Longleftrightarrow x^{\underline{n}} = \sum_{k=0}^n (-1)^{n-k} L(n, k) x^{\overline{k}} \end{aligned} xn=k=0n(1)nk[nk]xkxn=k=0n[nk]xkxn=k=0nL(n,k)xkxn=k=0n{nk}xkxn=k=0n(1)nk{nk}xkxn=k=0n(1)nkL(n,k)xk
其中:
L ( n , k ) = ∑ j [ n j ] { j k } = ( n − 1 k − 1 ) n ! k ! . 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!}. L(n,k)=j[nj]{jk}=(k1n1)k!n!.
注:最常用的是将 x n x^n xn分成若干个 x k ‾ x^{\underline{k}} xk之和,或者是 ( x k ) \binom{x}{k} (kx)之和,即
x n = ∑ k = 0 n { n k } x k ‾ = ∑ k = 0 n k ! { n k } ( 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}. xn=k=0n{nk}xk=k=0nk!{nk}(kx).

stirling 反演

斯特林数和阶乘幂的关系可推广至一般函数:
g ( n ) = ∑ k = 0 n ( − 1 ) n − k [ n k ] f ( k ) ⟺ f ( n ) = ∑ k = 0 n { n k } g ( k ) g ( n ) = ∑ k = 0 n L ( n , k ) f ( k ) ⟺ f ( n ) = ∑ k = 0 n ( − 1 ) n − k L ( n , k ) g ( k ) \begin{aligned} g(n) = \sum_{k=0}^n (-1)^{n-k} \begin{bmatrix} n \\ k \end{bmatrix} f(k) &amp; \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) &amp; \Longleftrightarrow f(n) = \sum_{k=0}^n (-1)^{n-k} L(n, k) g(k) \end{aligned} g(n)=k=0n(1)nk[nk]f(k)g(n)=k=0nL(n,k)f(k)f(n)=k=0n{nk}g(k)f(n)=k=0n(1)nkL(n,k)g(k)

第一类斯特林数的快速求解

为快速计算 [ n k ] \begin{bmatrix} n \\ k \end{bmatrix} [nk],我们利用
x n ‾ = ∑ k = 0 n [ n k ] x k . x^{\overline{n}} = \sum_{k=0}^n \begin{bmatrix} n \\ k \end{bmatrix} x^k. xn=k=0n[nk]xk.
f ( x ) = x n ‾ , g ( x ) = ( x + n ) n ‾ f(x) = x^{\overline{n}}, g(x) = (x+n)^{\overline{n}} f(x)=xn,g(x)=(x+n)n,则 f ( x ) g ( x ) = x 2 n ‾ f(x)g(x) = x^{\overline{2n}} f(x)g(x)=x2n。这样我们就能从 [ n k ] \begin{bmatrix} n \\ k \end{bmatrix} [nk] 得到 [ 2 n k ] \begin{bmatrix} 2n \\ k \end{bmatrix} [2nk] .

计算过程如下,设:
f ( x ) = ∑ k = 0 n a k x k , f(x) = \sum_{k=0}^n a_k x^k, f(x)=k=0nakxk,
则:
g ( x ) = ∑ k = 0 n a k ( x + n ) k = ∑ k = 0 n a k ∑ i = 0 k ( k i ) n k − i x i = ∑ k = 0 n 1 ( n − k ) ! x n − k ∑ i + j = k n i i ! a n − j ( n − j ) ! \begin{aligned} g(x) &amp; = \sum_{k=0}^n a_k (x+n)^k \\ &amp; = \sum_{k=0}^n a_k \sum_{i=0}^k \binom{k}{i} n^{k-i} x^i \\ &amp; = \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)=k=0nak(x+n)k=k=0naki=0k(ik)nkixi=k=0n(nk)!1xnki+j=ki!nianj(nj)!
就变成了卷积计算。每一次倍增用快速傅里叶变换则计算g(x)的时间复杂度为O(nlogn)。

总复杂度为 T ( n ) = T ( n / 2 ) + O ( n log ⁡ n ) = O ( n log ⁡ n ) T(n) = T(n/2)+O(n\log n)=O(n\log n) T(n)=T(n/2)+O(nlogn)=O(nlogn)

reference:

证明:百度百科 公式:返回主页liouzhou_101

复杂度:

递推的话是 O ( n 2 ) O(n^2) O(n2)

注意到第二类stirling数可以卷积,用FFT O ( n l o g n ) O(nlogn) O(nlogn)

第一类也可以构造出卷积, O ( n l o g n ) O(nlogn) O(nlogn)

例题

Count the Buildings给你一个n,表示有n个高度分别为1,2,3……n的楼,然后要求你排列这n个楼的位置,使得从最左端看能看到x个楼,从最右端看到y个楼,问你满足要求的方案数。

解:先将最高的楼去掉,然后将剩下的n-1个楼分成x-1+y-1组,每组内部是随意排列的,而组之间要保证从左/右往中间是递增的,这就是第一类斯特林数的定义。在中x-1+y-1组中选x-1个放在左边,得到公式:
S ( n − 1 , x − 1 + y − 1 ) ∗ C ( x − 1 + y − 1 , x − 1 ) S(n-1,x-1+y-1)*C(x-1+y-1,x-1) S(n1,x1+y1)C(x1+y1,x1)
exe

CodeForces 932E. Team Work从n≤1e9个人中选取一个非空子集X,求所有可能的子集大小的次方之和即 ∣ X ∣ k |X|^k Xk,k≤5000

HDU 4625. JZPTREE每条边的长度为1,对每个节点u,求 E u = ∑ v = 1 n ( d ( u , v ) ) k , E_u = \sum_{v=1}^n (d(u, v))^k, Eu=v=1n(d(u,v))k,

CodeForces 1097G. Vladislav and a Great Legend类似上一题

CodeForces 960G. Bandit Blues类似例题

Coefficienthdu多校求泰勒展开系数,dls说有用到stirling数

代码

using namespace std;
typedef long long giant;
const int maxn=2e3+1;
const giant q=1e9+7;
giant c[maxn][maxn],s[maxn][maxn];
int main() {#ifndef ONLINE_JUDGEfreopen("test.in","r",stdin);#endifc[0][0]=s[0][0]=1;for (register int i=1;i<maxn;++i) {c[i][0]=1;for (register int j=1;j<=i;++j) {c[i][j]=(c[i-1][j]+c[i-1][j-1])%q;s[i][j]=(s[i-1][j-1]+((i-1)*s[i-1][j])%q)%q;}}int T=read();while (T--) {int n=read(),f=read(),b=read();giant ans=(c[b+f-2][b-1]*s[n-1][b+f-2])%q;printf("%lld\n",ans);}
}

这篇关于知识点 - Stirling数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/401995

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

【反射知识点详解】

Java中的反射(Reflection)是一个非常强大的机制,它允许程序在运行时检查或修改类的行为。这种能力主要通过java.lang.reflect包中的类和接口来实现。 通过反射,Java程序可以动态地创建对象、调用方法、访问字段,以及获取类的各种信息(如构造器、方法、字段等)。 反射的用途 反射主要用于以下几种情况: 动态创建对象:通过类的Class对象动态地创建其实例。访问类的字段

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

Python知识点:如何使用Python开发桌面应用(Tkinter、PyQt)

Python 提供了多个库来开发桌面应用程序,其中最常见的两个是 Tkinter 和 PyQt。这两者各有优点,选择取决于你的需求。以下我会介绍如何使用 Tkinter 和 PyQt 开发简单的桌面应用程序。 1. 使用 Tkinter 开发桌面应用 Tkinter 是 Python 的标准库,它非常轻量级且跨平台。它适合开发简单的桌面应用,入门较容易。 安装 Tkinter Tkinte

Python知识点:如何使用Anaconda进行科学计算环境管理

使用 Anaconda 进行科学计算环境管理是一个非常强大且灵活的方式,特别适合处理 Python 和 R 语言的包管理和虚拟环境管理。Anaconda 集成了许多用于科学计算和数据分析的库,并提供了环境隔离的功能,确保不同项目之间不会发生包冲突。以下是使用 Anaconda 进行科学计算环境管理的详细步骤: 1. 安装 Anaconda 首先,你需要在本地机器上安装 Anaconda。你可以