斯特林(Stirling)数
斯特林(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)数相关推荐
- 第一、二类斯特林(Stirling)数的生成函数(母函数)及推导
文章目录 预备定义 第一类StirlingStirlingStirling数s(n,k)s(n,k)s(n,k)及第一类无符号StirlingStirlingStirling数c(n,k)c(n,k) ...
- 【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )
文章目录 一.Stirling 子集数 二.放球模型 三.Stirling 子集数递推公式 四.Stirling 子集数示例 ( 四元集等价关系个数 ) 五.划分的二元关系 加细关系 一.Stirli ...
- 第二类Stirling数(第二类斯特林数)
第二类Stirling数(第二类斯特林数) 定义 第二类Stirling数表示把nnn个不同的数划分为mmm个集合的方案数,要求不能为空集,写作S(n,m)S(n,m)S(n,m). 和第一类Stir ...
- 第一类Stirling数(第一类斯特林数)
第一类Stirling数(第一类斯特林数) 定义 第一类Stirling数表示把nnn个不同元素构成mmm个圆的排列方案数,写作s(n,m)s(n,m)s(n,m). 根据正负性分为无符号第一类Sti ...
- 第一类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- ...
- 【转】第一类Stirling数和第二类Stirling
转自:http://blog.csdn.net/acdreamers/article/details/8521134 第一类Stirling数 s(p,k) s(p,k)的一个的组合学解释是:将 ...
- HDU 2643 Rank:第二类Stirling数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2643 题意: 有n个个选手参赛,问排名有多少种情况(可以并列). 题解: 简化问题: 将n个不同的元素 ...
- 高等组合学笔记(八):第一类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, ...
- 高等组合学笔记(六): 第二类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 ...
- 斯特灵数 (Stirling数)
@维基百科 在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的. 第一类 s(4,2)=11 第一类Stirling数是有正负的,其绝对值是个元素的项目分 ...
最新文章
- 读写分离很难吗?SpringBoot结合aop简单就实现了
- Hadoop入门(十九)Mapreduce的最大值程序
- 一个程序员的爱情表白书
- c# 获取路径的盘符_c#获取驱动器盘符
- in、at和on作为方位介词_21
- android 广告close,小程序广告弹出与关闭
- java类和对象数组传参_Java 练习(替换数组元素, 将对象作为参数传递给方法)
- 姆巴佩独造三球一战成名 阿里云打破世界杯流量纪录 1
- 解决Ubuntu16.04解压cudnn文件时报错could not create a hard link file
- 【最全的】BAT 批处理脚本教程
- wan端口未连接怎么弄_路由器WAN口未连接解决方法,WAN口未连接怎么办
- CGB2104-Day17
- STUN协议简要介绍
- 计算机创新杯说课大赛课件,信息化教学设计方案创新杯说课大赛国赛说课课件.doc...
- Jmeter - if控制器
- 好嗨游戏 || 20款全世界最佳移动RPG角色扮演游戏(下)
- 端智能在大众点评搜索重排序的应用实践
- c语言上机考题库,C语言上机考题库.doc
- threejs 向量夹角 两点确定一个向量 两条线确定一个夹角
- python自动化配置路由器_H3C MSR 系列路由器 配置指导(V7)-R0304-6W105
热门文章
- Deploying guidelines and a simplified data model ...文献笔记
- 【matlab图像处理】图像处理工具箱(2)
- Excel做多元线性回归
- Go 环境变量、go env
- FTP上传文件与服务器的连接被重置,ftp 服务器连接被重置
- Ultra Fast Deep Lane Detection with Hybrid Anchor Driven Ordinal Classification论文解读
- jsp中你必须记住的379
- offline RL介绍
- leetcode:94. 二叉树的中序遍历
- 全国哀悼日,网站黑白素配方法