斯特林(Stirling)数

斯特林数是组合数学中,关于子集划分和置换划分的一类问题的解。其中,分为第一类斯特林数和第二类斯特林数。

第一类斯特林数

[nk]{n \brack k}[kn​] 表示nnn个元素排成kkk个轮换。这里的轮换是指:

例如存在轮换[1,2,3][1,2,3][1,2,3],那么意思就是存在三个相等序列[1,2,3]=[2,3,1]=[3,1,2][1,2,3]=[2,3,1]=[3,1,2][1,2,3]=[2,3,1]=[3,1,2]。

特别的,一个元素的轮换只有他本身,因为[1][1][1]单个元素只能和自己轮换。两个元素的轮换也只有一个,因为[1,2]=[2,1][1,2]=[2,1][1,2]=[2,1]是同一个轮换。

一般来说,对于[n1]{n \brack 1}[1n​],每一个nnn个元素的全排列正好对应nnn个轮换,因此根据除法原理:

[n1]=n!n=(n−1)!{n \brack 1} = \frac{n!}{n} = (n-1)! [1n​]=nn!​=(n−1)!

事实上,还容易看出:

[nn]=1{n \brack n} = 1 [nn​]=1

[nn−1]=(n2){n \brack n-1} = \binom{n}{2} [n−1n​]=(2n​)

对于最后一个等式,运用的鸽巢原理,相当于我们把nnn个元素放进n−1n-1n−1个箱子里面,并且不能放空,那么必有两个元素在同一个箱子里面,因为有两个元素的那个箱子的轮换相等,所以我们不用做任何处理。

现在我们考虑第一类斯特林数的递推公式,考虑nnn个元素最后一个元素nnn,对于他的安放方式有两种。第一种自己单独成为一个轮换,方案数为[n−1k−1]{n-1 \brack k-1}[k−1n−1​]。第二种,插入前n−1n-1n−1个元素生成的kkk个轮换中,方案数为(n−1)[n−1k](n-1){n-1 \brack k}(n−1)[kn−1​](对于每一个轮换,假如这个轮换的大小为∣S∣|S|∣S∣,那么插入一个元素变成一个新的轮换有∣S∣|S|∣S∣种方式,即可以在每一个元素前面插入而不重复,因为∑∣Si∣=(n−1)\sum |S_i|=(n-1)∑∣Si​∣=(n−1),故总共有(n−1)(n-1)(n−1)种插入方式),因此,我们的递推公式为:

[nk]=[n−1k−1]+(n−1)[n−1k]{n \brack k} = {n-1 \brack k-1} + (n-1){n-1 \brack k} [kn​]=[k−1n−1​]+(n−1)[kn−1​]

其中,我们认为:

[00]=1[n0]=0(n>0){0 \brack 0} = 1 \\ {n \brack 0} = 0 (n \gt 0) [00​]=1[0n​]=0(n>0)

例题

看不到的火柴数

LeetCode 5762

设答案为P(n,k)P(n,k)P(n,k)

我们考虑最后一个位置能看到或者不能看到。如果能看到那么长度为nnn的火柴必定在最后一个位置,方案数为P(n−1,k−1)P(n - 1,k - 1)P(n−1,k−1)。如果看不到,那么最后一个位置上的元素可以是前[1,n−1][1,n-1][1,n−1]内的所有元素和元素nnn做置换,相对大小不变,因此方案数为(n−1)∗P(n−1,k)(n-1)*P(n-1,k)(n−1)∗P(n−1,k)。因此递推公式为:

P(n,k)=P(n−1,k−1)+(n−1)∗P(n−1,k)P(n,k) = P(n - 1,k - 1) + (n-1)*P(n-1,k) P(n,k)=P(n−1,k−1)+(n−1)∗P(n−1,k)

答案就是第一类斯特林数。P(n,k)=[nk]P(n,k) = {n \brack k}P(n,k)=[kn​]

高楼

HDU4372

我们枚举最高建筑nnn的位置,他前面可以有[0,n−1][0,n-1][0,n−1]个建筑,故答案为:

ans=∑i=0n−1[if−1][n−i−1b−1](n−1i)ans = \sum_{i = 0}^{n-1} {i \brack f - 1} {n - i - 1 \brack b - 1} \binom{n - 1}{i} ans=i=0∑n−1​[f−1i​][b−1n−i−1​](in−1​)

查询次数很多,这么做必定会超时。因此我们必须使用一个神奇的公式化简这个和式。

具体的,我们把最高建筑nnn放在最后面,构造[n−1f+b−2]{n - 1 \brack f + b - 2}[f+b−2n−1​],接着,然后把前面的b−1b-1b−1个圆排列移到后面去,因此答案为:

ans=[n−1f+b−2](f+b−2b−1)ans = {n - 1 \brack f + b - 2} \binom{f + b - 2}{b - 1} ans=[f+b−2n−1​](b−1f+b−2​)

这样,我们得到了一个很重要的公式:

[nl+m](l+ml)=∑k[kl][n−km](nk){n \brack l + m} \binom{l + m}{l} = \sum_k {k \brack l}{n-k \brack m} \binom{n}{k} [l+mn​](ll+m​)=k∑​[lk​][mn−k​](kn​)

第二类斯特林数

第二类斯特林数{nm}{n \brace m}{mn​}是指,将nnn个不同的元素划分为mmm个相同的非空集合的方案数。

有如下递推式子:

{nm}={n−1m−1}+{n−1m}×m{n \brace m} = {n-1 \brace m-1} + {n-1 \brace m} \times m {mn​}={m−1n−1​}+{mn−1​}×m

我们考虑最后一个元素的划分,第一种方式将最后一个元素单独放在一个集合中,需要将前n−1n-1n−1个元素划分成m−1m-1m−1个集合。第二种情况将最后一个元素插入到之前已经划分好的集合中,有mmm中插入方式,插入到每个集合都是不同的,方案数为{n−1m}×m{n-1 \brace m} \times m{mn−1​}×m。

P1655 模板

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define FR freopen("in.txt", "r", stdin)
#define FW freopen("out.txt", "w", stdout)struct Decimal
{int bits[500];int tot;Decimal() : Decimal(0){}Decimal(int init) : tot(0){fill(bits, bits + 500, 0);if (init == 0){tot = 1;return;}for (; init; init /= 10){bits[tot++] = init % 10;}}Decimal operator+(Decimal o){Decimal ans(0);int i = 0;for (; i < max(tot, o.tot); i++){ans.bits[i] += bits[i] + o.bits[i];ans.bits[i + 1] += ans.bits[i] / 10;ans.bits[i] %= 10;}ans.tot = ans.bits[i] == 0 ? i : i + 1;return ans;}Decimal operator*(Decimal o){Decimal ans(0);for (int i = 0; i < tot; i++){for (int j = 0; j < o.tot; j++){ans.bits[i + j] += bits[i] * o.bits[j];ans.bits[i + j + 1] += ans.bits[i + j] / 10;ans.bits[i + j] %= 10;}}int t = tot + o.tot - 1;while (ans.bits[t] == 0)t--;ans.tot = t + 1;return ans;}Decimal operator*(int k){Decimal fact(k);return (*this) * fact;}void output(){for (int i = tot - 1; i >= 0; i--){putchar(bits[i] + '0');}putchar('\n');}
};Decimal stir[105][105];int main()
{stir[0][0] = Decimal(1);for (int n = 1; n <= 101; n++){for (int m = 1; m <= min(101, n); m++){stir[n][m] = stir[n - 1][m - 1] + stir[n - 1][m] * m;}}int N, M;while (scanf("%d %d", &N, &M) != EOF){stir[N][M].output();}return 0;
}

斯特林(Stirling)数相关推荐

  1. 第一、二类斯特林(Stirling)数的生成函数(母函数)及推导

    文章目录 预备定义 第一类StirlingStirlingStirling数s(n,k)s(n,k)s(n,k)及第一类无符号StirlingStirlingStirling数c(n,k)c(n,k) ...

  2. 【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )

    文章目录 一.Stirling 子集数 二.放球模型 三.Stirling 子集数递推公式 四.Stirling 子集数示例 ( 四元集等价关系个数 ) 五.划分的二元关系 加细关系 一.Stirli ...

  3. 第二类Stirling数(第二类斯特林数)

    第二类Stirling数(第二类斯特林数) 定义 第二类Stirling数表示把nnn个不同的数划分为mmm个集合的方案数,要求不能为空集,写作S(n,m)S(n,m)S(n,m). 和第一类Stir ...

  4. 第一类Stirling数(第一类斯特林数)

    第一类Stirling数(第一类斯特林数) 定义 第一类Stirling数表示把nnn个不同元素构成mmm个圆的排列方案数,写作s(n,m)s(n,m)s(n,m). 根据正负性分为无符号第一类Sti ...

  5. 第一类Stirling数和第二类Stirling

    第一类Stirling数 s(p,k)    s(p,k)的一个的组合学解释是:将p个物体排成k个非空循环排列的方法数. s(p,k)的递推公式: s(p,k)=(p-1)*s(p-1,k)+s(p- ...

  6. 【转】第一类Stirling数和第二类Stirling

    转自:http://blog.csdn.net/acdreamers/article/details/8521134 第一类Stirling数 s(p,k)    s(p,k)的一个的组合学解释是:将 ...

  7. HDU 2643 Rank:第二类Stirling数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2643 题意: 有n个个选手参赛,问排名有多少种情况(可以并列). 题解: 简化问题: 将n个不同的元素 ...

  8. 高等组合学笔记(八):第一类Stirling数, 整数分拆

    第一类Stirling数的递推关系式 定理A: s(n,k)=s(n−1,k−1)−(n−1)s(n−1,k),(n,k≥1),s(n,0)=s(0,k)=0,(n,k≥1),s(0,0)=1s(n, ...

  9. 高等组合学笔记(六): 第二类Stirling数,第一类Stirling数以及生成函数

    集合的分类 定理: nnn元集合NNN的分类μ=(A1,A2,⋯,Am)\mu=(A_1,A_2,\cdots,A_m)μ=(A1​,A2​,⋯,Am​), (∣Ai∣=ai|A_i|=a_i∣Ai​ ...

  10. 斯特灵数 (Stirling数)

    @维基百科 在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的. 第一类 s(4,2)=11 第一类Stirling数是有正负的,其绝对值是个元素的项目分 ...

最新文章

  1. 读写分离很难吗?SpringBoot结合aop简单就实现了
  2. Hadoop入门(十九)Mapreduce的最大值程序
  3. 一个程序员的爱情表白书
  4. c# 获取路径的盘符_c#获取驱动器盘符
  5. in、at和on作为方位介词_21
  6. android 广告close,小程序广告弹出与关闭
  7. java类和对象数组传参_Java 练习(替换数组元素, 将对象作为参数传递给方法)
  8. 姆巴佩独造三球一战成名 阿里云打破世界杯流量纪录 1
  9. 解决Ubuntu16.04解压cudnn文件时报错could not create a hard link file
  10. 【最全的】BAT 批处理脚本教程
  11. wan端口未连接怎么弄_路由器WAN口未连接解决方法,WAN口未连接怎么办
  12. CGB2104-Day17
  13. STUN协议简要介绍
  14. 计算机创新杯说课大赛课件,信息化教学设计方案创新杯说课大赛国赛说课课件.doc...
  15. Jmeter - if控制器
  16. 好嗨游戏 || 20款全世界最佳移动RPG角色扮演游戏(下)
  17. 端智能在大众点评搜索重排序的应用实践
  18. c语言上机考题库,C语言上机考题库.doc
  19. threejs 向量夹角 两点确定一个向量 两条线确定一个夹角
  20. python自动化配置路由器_H3C MSR 系列路由器 配置指导(V7)-R0304-6W105

热门文章

  1. Deploying guidelines and a simplified data model ...文献笔记
  2. 【matlab图像处理】图像处理工具箱(2)
  3. Excel做多元线性回归
  4. Go 环境变量、go env
  5. FTP上传文件与服务器的连接被重置,ftp 服务器连接被重置
  6. Ultra Fast Deep Lane Detection with Hybrid Anchor Driven Ordinal Classification论文解读
  7. jsp中你必须记住的379
  8. offline RL介绍
  9. leetcode:94. 二叉树的中序遍历
  10. 全国哀悼日,网站黑白素配方法