「学习笔记」组合数学
本文部分内容来自 。
加法 & 乘法原理#
加法原理#
完成一个工程可以有 类办法, 代表第 类方法的数目。那么完成这件事共有 种不同的方法。
乘法原理#
完成一个工程需要分 个步骤, 代表第 个步骤的不同方法数目。那么完成这件事共有 种不同的方法。
排列与组合#
排列#
从 个不同元素中,任取 (, 与 均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 个不同元素中取出 个元素的一个排列;从 个不同元素中取出 个元素的所有排列的个数,叫做从 个不同元素中取出 个元素的排列数,用符号 (或者是 )表示。
公式可以这样理解: 个人选 个来排队 。第一个位置可以选 个,第二位置可以选 个,以此类推,第 个(最后一个)可以选 个,得:
全排列: 个人全部来排队,队长为 。第一个位置可以选 个,第二位置可以选 个,以此类推得:
全排列是排列数的一个特殊情况。
组合#
从 个不同元素中,任取 个元素组成一个集合(不是排列),叫做从 个不同元素中取出 个元素的一个组合;从 个不同元素中取出 个元素的所有组合的个数,叫做从 个不同元素中取出 个元素的组合数,用符号 来表示,读作「 选 」。
组合数计算公式
如何理解上述公式?我们考虑 个人选 个出来(),不排队,不在乎顺序。如果在乎顺序那么就是
,如果不在乎那么就要除掉重复,那么重复了多少?同样选出来的 个人,他们还要「全排」得 。
组合数也常用 表示,即 。现在数学界普遍采用 的记号而非 。
特别地,规定当 时,。
关于组合数的一些公式#
这个应该很好理解,不选和全选的方式就只有一种情况。
这个公式可以这么理解,你在 个人中选走了 个人,另一个人把剩下的 个人给选走了,对你来说,你选人的方案数为 ,而另一个人选人的方案数与我们是一样的,换位思考一下,倘若主动权在另一个人手中,则他选人的方案数就是 ,方案数不变,两者是等价的,故得 。
这个公式可以这么理解,对于从 个人中选 个人的方案数,可以分第一个人选或不选两种方案,如果第一个人选,则方案数为 ,如果第一个人不选,则方案数为 ,加起来即为 。
由此,我们可以得到组合数的递推公式,下面是递推求组合数的代码。
for (int i = 0; i <= n; ++ i) {
C[i][0] = 1;
for (int j = 1; j <= i; ++ j) {
C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
}
}
对于 个数,每个数都有选或不选两种情况,总共有 种情况,上面的公式包括了除了每个数都不选这 种情况外的所有情况,因此情况数为 。
同时可得到另一个公式:
还有一些别的:
插板法#
现在有 个完全相同的元素,要求将其分成 组,保证每组不为空,一共有多少种分法?
考虑在这 个元素形成的 个空中插入 个板将他们隔开,分成 组。
答案:。
本质是求 的正整数解的组数
现在允许可以有为空的组,其余条件与上题一样
考虑借来 个元素,这 个元素分别放入 组,最后分好 组后再将这 个元素删掉,这样就转化成了上面的问题,将这 个元素分成 组,每组不能为空,公式:
现在每组中都有限制,第 组内的元素个数要求不少于 个,保证 。
考虑先将这 个元素,按照要求分在各个组里,现在还剩下 个元素,转化成上面的问题,将这 个元素分到 组里,可以有为空的组,公式:
从 这 个自然数中,选出 个不相邻的数的方案数。
考虑选出 个位置,这样就产生了 个空,将 个元素插入到这些空中,最后从前往后依次标号即可,方案数:
多重集#
有重复元素的广义集合。设 表示由 个 、 个 、 个 …… 个 组成的多重集。
多重集的排列#
设 ,所有元素总的排列为 ,除去相同元素的排列 ,最后的全排列公式为:
具体地,你可以认为你有 种不一样的球,每种球的个数分别是 ,且 。这 个球的全排列数就是 多重集的排列数。多重集的排列数常被称作 多重组合数。
多重组合数符号
多重集的组合#
设 表示由 个 , 个 ,…, 个 组成的多重集。那么对于整数 ,从 中选择 个元素组成一个多重集的方案数就是 多重集的组合数。这个问题等价于 的非负整数解的数目,可以用插板法解决,参考上面插板法的问题二,公式:
上面对于 的限制是 ,现在对于 的限制是 ,这里要用容斥,最后的结果是:
其中 是充当枚举子集的作用,满足 。
圆排列#
个人全部来围成一圈,所有的排列数记为 。考虑其中已经排好的一圈,从不同位置断开,又变成不同的队列。 所以有
由此可知部分圆排列的公式:
二项式定理#
之前写了:「学习笔记」从二项式定理到多项式定理
抽屉原理(鸽巢原理)#
现在有 个东西,放到 个抽屉里面去,那么肯定有一个抽屉放了 个东西。
不信你自己试试看。
让我们扩展一下:现在要把 个东西放到 个抽屉中去,则至少有 个抽屉至少有 个东西。
定理很简单,这类题目真正难的地方在于你要能看出它是抽屉原理,要知道谁是抽屉,谁是东西。
容斥原理#
之前写了:「学习笔记」容斥原理
错位排列#
错位排列(derangement)是没有任何元素出现在其有序位置的排列。即,对于 的排列 ,如果满足 ,则称 是 的错位排列。
把错位排列问题具体化,考虑这样一个问题:
封不同的信,编号分别是 ,现在要把这五封信放在编号 的信封中,要求信封的编号与信的编号不一样。问有多少种不同的放置方法?
假设考虑到第 个信封,初始时暂时把第 封信放在第 个信封中,然后考虑两种情况的递推:
-
前面 个信封全部装错;
-
前面 个信封有一个没有装错其余全部装错。
对于第一种情况,前面 个信封全部装错:因为前面 个已经全部装错了,所以第 封只需要与前面任意一个位置交换即可,总共有 种情况。
对于第二种情况,前面 个信封有一个没有装错其余全部装错:考虑这种情况的目的在于,若 个信封中如果有一个没装错,那么把那个没装错的与 交换,即可得到一个全错位排列情况。
其他情况,不可能通过一次操作来把它变成一个长度为 的错排。
于是可得,错位排列数满足递推关系:
斯特林数#
第二类斯特林数#
第二类斯特林数(斯特林子集数) ,也可记做 ,表示将 个两两不同的元素,划分为 个互不区分的非空子集的方案数。
递推式:
边界是 。
考虑用组合意义来证明。
我们插入一个新元素时,有两种方案:
将新元素单独放入一个子集,有 种方案;
将新元素放入一个现有的非空子集,有 种方案。
根据加法原理,将两式相加即可得到递推式。
第一类斯特林数#
第一类斯特林数(斯特林轮换数),也可记做 ,表示将 个两两不同的元素,划分为 个互不区分的非空轮换的方案数。
一个轮换就是一个首尾相接的环形排列。我们可以写出一个轮换 ,并且我们认为 ,即,两个可以通过旋转而互相得到的轮换是等价的。注意,我们不认为两个可以通过翻转而相互得到的轮换等价,即 。
递推式:
边界是 。
该递推式的证明可以考虑其组合意义。
我们插入一个新元素时,有两种方案:
-
将该新元素置于一个单独的轮换中,共有 种方案;
-
将该元素插入到任何一个现有的轮换中,共有 种方案。
根据加法原理,将两式相加即可得到递推式。
组合数的题目#
有 个数,,选 个数,不计顺序,一个数可以选多次,求方案数。
假设选出的数是 ,这 个数不能重复,且递增选出。方案数:
这是我们所知道的,。
但是,对于这个题来说,情况是 ,因此我们需要转化过去,即
考虑构造,
那么, 就转化为了
我们的方案数也呼之欲出了:。
作者:yifan0305
出处:https://www.cnblogs.com/yifan0305/p/17485986.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载时还请标明出处哟!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2022-08-30 「刷题记录」LOJ/一本通提高篇 深搜的剪枝技巧