zoukankan      html  css  js  c++  java
  • 基本排列组合

    加法 & 乘法原理

    加法原理

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

    乘法原理

    完成一个工程需要分 (n) 个步骤, (a_i(1 le i le n)) 代表第 (i) 个步骤的不同方法数目。那么完成这件事共有 (S = a_1 imes a_2 imes cdots imes a_n) 种不同的方法。

    排列与组合基础

    排列数

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

    排列的计算公式如下:

    [mathrm A_n^m = n(n-1)(n-2) cdots (n-m+1) = frac{n!}{(n - m)!} ]

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

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

    [mathrm A_n^m = n(n-1)(n-2) cdots (n-m+1) = frac{n!}{(n - m)!} ]

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

    [mathrm A_n^n = n(n-1)(n-2) cdots 3 × 2 × 1 = n! ]

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

    组合数

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

    组合数计算公式

    [mathrm C_n^m = frac{mathrm A_n^m}{m!} = frac{n!}{m!(n - m)!} ]

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

    [mathrm C_n^m imes m! = mathrm A_n^m\ mathrm C_n^m = frac{mathrm A_n^m}{m!} = frac{n!}{m!(n-m)!} ]

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

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

    特别地,规定当 (m>n) 时, (mathrm A_n^m=mathrm C_n^m=0)

    二项式定理

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

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

    [(a+b)^n=sum_{i=0}^ninom{n}{i}a^{n-i}b^i ]

    证明可以采用数学归纳法,利用 (displaystyle inom{n}{k}+inom{n}{k-1}=inom{n+1}{k}) 做归纳。

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

    设 n 为正整数, (x_i) 为实数,

    [(x_1 + x_2 + cdots + x_t)^n = sum_{满足 n_1 + cdots + n_t=n 的非负整数解} inom{n}{n_1n_2cdots n_t} x_1^{n_1}x_2^{n_2}cdots x_t^{n_t} ]

    其中的 (inom{n}{n_1n_2cdots n_t}) 是多项式系数,它的性质也很相似:

    [sum{inom{n}{n_1n_2cdots n_t}} = t^n ]

    排列与组合进阶篇

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

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

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

    多重集是指包含重复元素的广义集合。设 (S={n_1cdot a_1,n_2cdot a_2,cdots,n_kcdot a_k,}) 表示由 (n_1)(a_1)(n_2)(a_2) ,…, (n_k)(a_k) 组成的多重集, (S) 的全排列个数为

    [frac{n!}{prod_{i=1}^kn_i!}=frac{n!}{n_1!n_2!cdots n_k!} ]

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

    [inom{n}{n_1,n_2,cdots,n_k}=frac{n!}{prod_{i=1}^kn_i!} ]

    可以看出, (displaystyle inom{n}{m}) 等价于 (displaystyle inom{n}{m,n-m}) ,只不过后者较为繁琐,因而不采用。

    多重集的组合数 1

    (S={n_1cdot a_1,n_2cdot a_2,cdots,n_kcdot a_k,}) 表示由 (n_1)(a_1)(n_2)(a_2) ,…, (n_k)(a_k) 组成的多重集。那么对于整数 (r(r<n_i,forall iin[1,k])) ,从 (S) 中选择 (r) 个元素组成一个多重集的方案数就是 多重集的组合数 。这个问题等价于 (x_1+x_2+cdots+x_k=r) 的非负整数解的数目,可以用插板法解决,答案为

    [inom{r+k-1}{k-1} ]

    多重集的组合数 2

    考虑这个问题:设 (S={n_1cdot a_1,n_2cdot a_2,cdots,n_kcdot a_k,}) 表示由 (n_1)(a_1)(n_2)(a_2) ,…, (n_k)(a_k) 组成的多重集。那么对于正整数 (r) ,从 (S) 中选择 (r) 个元素组成一个多重集的方案数。

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

    [forall iin [1,k], x_ile n_i, sum_{i=1}^kx_i=r ]

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

    1. 全集: (displaystyle sum_{i=1}^kx_i=r) 的非负整数解。
    2. 属性: (x_ile n_i)

    于是设满足属性 (i) 的集合是 (S_i)(overline{S_i}) 表示不满足属性 (i) 的集合,即满足 (x_ige n_i+1) 的集合。那么答案即为

    [left|igcap_{i=1}^kS_i ight|=|U|-left|igcup_{i=1}^koverline{S_i} ight| ]

    根据容斥原理,有:

    [egin{split} left|igcup_{i=1}^koverline{S_i} ight| &=&sum_ileft|overline{S_i} ight| -sum_{i,j}left|overline{S_i}capoverline{S_j} ight| +sum_{i,j,k}left|overline{S_i}capoverline{S_j}capoverline{S_k} ight| -cdots\ &&+(-1)^{k-1}left|igcap_{i=1}^koverline{S_i} ight|\ &=&sum_iinom{k+r-n_i-2}{k-1} -sum_{i,j}inom{k+r-n_i-n_j-3}{k-1}+sum_{i,j,k}inom{k+r-n_i-n_j-n_k-4}{k-1} -cdots\ &&+(-1)^{k-1}inom{k+r-sum_{i=1}^kn_i-k-1}{k-1} end{split} ]

    拿全集 (displaystyle |U|=inom{k+r-1}{k-1}) 减去上式,得到多重集的组合数

    [Ans=sum_{p=0}^k(-1)^psum_{A}inom{k+r-1-sum_{A} n_{A_i}-p}{k-1} ]

    其中 A 是充当枚举子集的作用,满足 (|A|=p, A_i<A_{i+1})

    不相邻的排列

    (1 sim n)(n) 个自然数中选 (k) 个,这 (k) 个数中任何两个数不相邻数的组合有 (displaystyle inom {n-k+1}{k}) 种。

    错位排列

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

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

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

    • 前面 (n-1) 个信封全部装错;
    • 前面 (n-1) 个信封有一个没有装错其余全部装错。

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

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

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

    于是可得错位排列的递推式为 (f(n)=(n-1)(f(n-1)+f(n-2)))

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

    圆排列

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

    [mathrm Q_n^n imes n = mathrm A_n^n Longrightarrow mathrm Q_n = frac{mathrm A_n^n}{n} = (n-1)! ]

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

    [mathrm Q_n^r = frac{mathrm A_n^r}{r} = frac{n!}{r imes (n-r)!} ]

    组合数性质 | 二项式推论

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

    [inom{n}{m}=inom{n}{n-m} ag{1} ]

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

    [inom{n}{k} = frac{n}{k} inom{n-1}{k-1} ag{2} ]

    由定义导出的递推式。

    [inom{n}{m}=inom{n-1}{m}+inom{n-1}{m-1} ag{3} ]

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

    [inom{n}{0}+inom{n}{1}+cdots+inom{n}{n}=sum_{i=0}^ninom{n}{i}=2^n ag{4} ]

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

    [sum_{i=0}^n(-1)^iinom{n}{i}=0 ag{5} ]

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

    [sum_{i=0}^m inom{n}{i}inom{m}{m-i} = inom{m+n}{m} (n geq m) ag{6} ]

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

    [sum_{i=0}^ninom{n}{i}^2=inom{2n}{n} ag{7} ]

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

    [sum_{i=0}^niinom{n}{i}=n2^{n-1} ag{8} ]

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

    [sum_{i=0}^ni^2inom{n}{i}=n(n+1)2^{n-2} ag{9} ]

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

    [sum_{l=0}^ninom{l}{k} = inom{n+1}{k+1} ag{10} ]

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

    [inom{n}{r}inom{r}{k} = inom{n}{k}inom{n-k}{r-k} ag{11} ]

    通过定义可以证明。

    [sum_{i=0}^ninom{n-i}{i}=F_{n+1} ag{12} ]

    其中 (F) 是斐波那契数列。

    [sum_{l=0}^n inom{l}{k} = inom{n+1}{k+1} ag{13} ]

    通过组合分析——考虑 (S={a_1, a_2, cdots, a_{n+1}})(k+1) 子集数可以得证。

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    计算机体系结构的铁律(iron law)
    PHP 画图——使用jpgraph画图
    理解Paxos Made Practical
    【bzoj1015】【JSOI2008】【星球大战】【并查集+离线】
    Spark调研笔记第3篇
    hduoj2094产生冠军
    使用HD/IDE层的ioctl接口获取磁盘容量get_hdd_max_sector
    给GridView设置行高
    tomcat的一些简单配置
    【JavaScript】--JavaScript总结一览无余
  • 原文地址:https://www.cnblogs.com/RioTian/p/13556477.html
Copyright © 2011-2022 走看看