基本排列组合

加法 & 乘法原理

加法原理

完成一个工程可以有 n 类办法, ai(1<i<n) 代表第 i 类方法的数目。那么完成这件事共有 S=a1+a2++an 种不同的方法。

乘法原理

完成一个工程需要分 n 个步骤, ai(1in) 代表第 i 个步骤的不同方法数目。那么完成这件事共有 S=a1×a2××an 种不同的方法。

排列与组合基础

排列数

n 个不同元素中,任取 mmnmn 均为自然数,下同)个元素按照一定的顺序排成一列,叫做从 n 个不同元素中取出 m 个元素的一个排列;从 n 个不同元素中取出 m ( mn ) 个元素的所有排列的个数,叫做从 n 个不同元素中取出 m 个元素的排列数,用符号 Anm (或者是 Pnm )表示。

排列的计算公式如下:

Anm=n(n1)(n2)(nm+1)=n!(nm)!

n! 代表 n 的阶乘,即 6!=1×2×3×4×5×6

公式可以这样理解: n 个人选 m 个来排队 ( mn )。第一个位置可以选 n 个,第二位置可以选 n1 个,以此类推,第 m 个(最后一个)可以选 nm+1 个,得:

Anm=n(n1)(n2)(nm+1)=n!(nm)!

全排列: n 个人全部来排队,队长为 n 。第一个位置可以选 n 个,第二位置可以选 n1 个,以此类推得:

Ann=n(n1)(n2)3×2×1=n!

全排列是排列数的一个特殊情况。

组合数

n 个不同元素中,任取 m ( mn ) 个元素组成一个集合,叫做从 n 个不同元素中取出 m 个元素的一个组合;从 n 个不同元素中取出 m ( mn ) 个元素的所有组合的个数,叫做从 n 个不同元素中取出 m 个元素的组合数。用符号 Cnm 来表示。

组合数计算公式

Cnm=Anmm!=n!m!(nm)!

如何理解上述公式?我们考虑 n 个人 m ( mn ) 个出来,不排队,不在乎顺序 Cnm 。如果在乎排列那么就是 Anm ,如果不在乎那么就要除掉重复,那么重复了多少?同样选出的来的 m 个人,他们还要“全排”得 Anm ,所以得:

Cnm×m!=AnmCnm=Anmm!=n!m!(nm)!

组合数也常用 (nm) 表示,读作「 nm 」,即 Cnm=(nm) 。实际上,后者表意清晰明了,美观简洁,因此现在数学界普遍采用 (nm) 的记号而非 Cnm

组合数也被称为「二项式系数」,下文二项式定理将会阐述其中的联系。

特别地,规定当 m>n 时, Anm=Cnm=0

二项式定理

在进入排列组合进阶篇之前,我们先介绍一个与组合数密切相关的定理——二项式定理。

二项式定理阐明了一个展开式的系数:

(a+b)n=i=0n(ni)anibi

证明可以采用数学归纳法,利用 (nk)+(nk1)=(n+1k) 做归纳。

二项式定理也可以很容易扩展为多项式的形式:

设 n 为正整数, xi 为实数,

(x1+x2++xt)n=n1++nt=n(nn1n2nt)x1n1x2n2xtnt

其中的 (nn1n2nt) 是多项式系数,它的性质也很相似:

(nn1n2nt)=tn

排列与组合进阶篇

接下来我们介绍一些排列组合的变种。

多重集的排列数 | 多重组合数

请大家一定要区分 多重组合数多重集的组合数 !两者是完全不同的概念!

多重集是指包含重复元素的广义集合。设 S={n1a1,n2a2,,nkak,} 表示由 n1a1n2a2 ,…, nkak 组成的多重集, S 的全排列个数为

n!i=1kni!=n!n1!n2!nk!

相当于把相同元素的排列数除掉了。具体地,你可以认为你有 k 种不一样的球,每种球的个数分别是 n1,n2,,nk ,且 n=n1+n2++nk 。这 n 个球的全排列数就是 多重集的排列数 。多重集的排列数常被称作 多重组合数 。我们可以用多重组合数的符号表示上式:

(nn1,n2,,nk)=n!i=1kni!

可以看出, (nm) 等价于 (nm,nm) ,只不过后者较为繁琐,因而不采用。

多重集的组合数 1

S={n1a1,n2a2,,nkak,} 表示由 n1a1n2a2 ,…, nkak 组成的多重集。那么对于整数 r(r<ni,i[1,k]) ,从 S 中选择 r 个元素组成一个多重集的方案数就是 多重集的组合数 。这个问题等价于 x1+x2++xk=r 的非负整数解的数目,可以用插板法解决,答案为

(r+k1k1)

多重集的组合数 2

考虑这个问题:设 S={n1a1,n2a2,,nkak,} 表示由 n1a1n2a2 ,…, nkak 组成的多重集。那么对于正整数 r ,从 S 中选择 r 个元素组成一个多重集的方案数。

这样就限制了每种元素的取的个数。同样的,我们可以把这个问题转化为带限制的线性方程求解:

i[1,k], xini, i=1kxi=r

于是很自然地想到了容斥原理。容斥的模型如下:

  1. 全集: i=1kxi=r 的非负整数解。
  2. 属性: xini

于是设满足属性 i 的集合是 SiSi 表示不满足属性 i 的集合,即满足 xini+1 的集合。那么答案即为

|i=1kSi|=|U||i=1kSi|

根据容斥原理,有:

|i=1kSi|=i|Si|i,j|SiSj|+i,j,k|SiSjSk|+(1)k1|i=1kSi|=i(k+rni2k1)i,j(k+rninj3k1)+i,j,k(k+rninjnk4k1)+(1)k1(k+ri=1knik1k1)

拿全集 |U|=(k+r1k1) 减去上式,得到多重集的组合数

Ans=p=0k(1)pA(k+r1AnAipk1)

其中 A 是充当枚举子集的作用,满足 |A|=p, Ai<Ai+1

不相邻的排列

1nn 个自然数中选 k 个,这 k 个数中任何两个数不相邻数的组合有 (nk+1k) 种。

错位排列

我们把错位排列问题具体化,考虑这样一个问题:

n 封不同的信,编号分别是 1,2,3,4,5 ,现在要把这 5 封信放在编号 1,2,3,4,5 的信封中,要求信封的编号与信的编号不一样。问有多少种不同的放置方法?

假设我们考虑到第 n 个信封,初始时我们暂时把第 n 封信放在第 n 个信封中,然后考虑两种情况的递推:

  • 前面 n1 个信封全部装错;
  • 前面 n1 个信封有一个没有装错其余全部装错。

对于第一种情况,前面 n1 个信封全部装错:因为前面 n1 个已经全部装错了,所以第 n 封只需要与前面任一一个位置交换即可,总共有 f(n1)×(n1) 种情况。

对于第二种情况,前面 n1 个信封有一个没有装错其余全部装错:考虑这种情况的目的在于,若 n1 个信封中如果有一个没装错,那么我们把那个没装错的与 n 交换,即可得到一个全错位排列情况。

其他情况,我们不可能通过一次操作来把它变成一个长度为 n 的错排。

于是可得错位排列的递推式为 f(n)=(n1)(f(n1)+f(n2))

错位排列数列的前几项为 0,1,2,9,44,265

圆排列

n 个人全部来围成一圈,所有的排列数记为 Qnn 。考虑其中已经排好的一圈,从不同位置断开,又变成不同的队列。
所以有

Qnn×n=AnnQn=Annn=(n1)!

由此可知部分圆排列的公式:

Qnr=Anrr=n!r×(nr)!

组合数性质 | 二项式推论

由于组合数在 OI 中十分重要,因此在此介绍一些组合数的性质。

(1)(nm)=(nnm)

相当于将选出的集合对全集取补集,故数值不变。(对称性)

(2)(nk)=nk(n1k1)

由定义导出的递推式。

(3)(nm)=(n1m)+(n1m1)

组合数的递推式(杨辉三角的公式表达)。我们可以利用这个式子,在 O(n2) 的复杂度下推导组合数。

(4)(n0)+(n1)++(nn)=i=0n(ni)=2n

这是二项式定理的特殊情况。取 a=b=1 就得到上式。

(5)i=0n(1)i(ni)=0

二项式定理的另一种特殊情况,可取 a=1,b=1

(6)i=0m(ni)(mmi)=(m+nm)   (nm)

拆组合数的式子,在处理某些数据结构题时会用到。

(7)i=0n(ni)2=(2nn)

这是 (6) 的特殊情况,取 n=m 即可。

(8)i=0ni(ni)=n2n1

带权和的一个式子,通过对 (3) 对应的多项式函数求导可以得证。

(9)i=0ni2(ni)=n(n+1)2n2

与上式类似,可以通过对多项式函数求导证明。

(10)l=0n(lk)=(n+1k+1)

可以通过组合意义证明,在恒等式证明中较常用。

(11)(nr)(rk)=(nk)(nkrk)

通过定义可以证明。

(12)i=0n(nii)=Fn+1

其中 F 是斐波那契数列。

(13)l=0n(lk)=(n+1k+1)

通过组合分析——考虑 S=a1,a2,,an+1k+1 子集数可以得证。

posted @   RioTian  阅读(775)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
点击右上角即可分享
微信分享提示

📖目录