在前一篇中我们提到的 C(n, m) 表示从n个元素中取m个元素组成m元组合的个数, 在组合学上还有另一种组合学意义: 两类元素的全排列的个数。
概念1: 全排列
在前一篇中提到了 n 个元素的m元排列, 当m=n时, 就称为n个元素的全排列, n个元素的全排列的个数为 P(n, n) = n! 个
1. 两类元素的全排列:
有两类元素 0 和 1, 总数为n个, 0为 m 个, 1 为 n-m 个, 那么这n个元素的全排列的个数为 C(n, m) 个。
这个其实很容易得出, 假如这n个元素互不相同, 则全排列有 n! 个, 现在固定 1 的位置排列 0 的位置, 有 m! 个, 但实际上m个0 是相同的, 只能算作一种, 要除以 m!
对元素类1也是如此, 因此两类元素的全排列的个数为 n! /(m!(n-m)!) = C(n, m)
有许多著名的组合问题与“两类元素的全排列”有关。
应用举例:
戏院售票处有 2n 个人在排队买票, 票价5元; 其中 n 个人拿的是5元的钱, n 个人拿的是 10 元的钱, 戏院初始没有零钱; 问这 2n 个人如何排队才能使每个人都不等待找零钱?
分析:
这个问题不是 2n 个人的排列问题, 其实是带限制条件的两类元素的全排列问题: 我们假设拿 5 元钱的人为0, 拿10元钱的人为1, 其全排列为 C(2n, n) 个;
不过, 这些排列中有些排列会使得有人等待找零钱, 如何计算这部分排列呢?
2. 折线模型和反射原理
为了解决前述的问题, 组合学上建立了折线模型:
在平面直角坐标系上, 在 x 轴和 y 轴上分别建立刻度单位为 1 的网格, 坐标原点表示戏院没有开始售票的起始状态; 由 0, 1 组成的序列表示排队序列, 当碰到0 (拿5元的) 从当前点画一条斜向上的对角线, 碰到1 则画一条斜向下的对角线, 这样一直进行, 直到读完这个输入序列, 终点为 (2n, 0) 如下图所示:
这种折线的条数正好是 C(2n, n) 。 当折线穿过 x 轴(与 y = -1 相交)时, 就说明出现了人等待找零钱的情况, 这种就是不符合条件的排列; 当折线与x轴刚相交时, 说明收到的5与10元的张数相等。
那么, 如何利用折线模型计算不符合条件的折线条数(排列数)呢? 可以利用反射的方法。
当折线首次与 y = -1 轴相交时, 把交点以后的折线关于 y=-1 进行反射, 反射以后, 折线仍以原点O 为起点, 但终点为 (2n, -2), 容易算出, 这种折线有 n-1 个上升段, n+1 个下降段。 也就是 n-1 个0, n+1 个1, 这类折线的条数为 C(2n, n-1)
从而满足条件的排队方法有: C(2n, n) - C(2n, n-1) = C(2n, n) / (n+1)
在应用折线模型时, 必须会计算两个整点间能够连接的折线条数以及明白反射原理。
反射定理:
设 A(m, a), B(n, b) 为平面上的两个整点, n > m, A与B能够用折线相连的条件是:
n-m >= |a-b| (1)
n-m ≡ b-a (mod 2) (2)
当条件满足时, 折线条数是: C(n-m, k), 其中 k = (n-m + b-a)/2
证明:
当条件满足时, AB的连接折线必然不只一条, 而且每条都有相同多的上升段, 相同多的下降段, 分别设为 x, y, 有
x + y = n - m
x - y = b - a
从而 x = (n-m + b-a)/2=k , y= (n-m + a-b)/2
定理的条件 (1) 保证了 x为非负数, 由两类元素的全排列公式, 折线条数为 C(n-m, k)