从 5 个人里挑 3 个,有两种问法,答案完全不同。「排成一队」在乎顺序——A 站第一和 B 站第一是两种结果;「组成一个小组」不在乎顺序——只要这三人在场,谁先谁后都一样。这就是全部分歧:顺序算不算数。
怎么从排列得到组合?每个 3 人小组内部能排成 $3!=6$ 种队形,组合把这 6 种当作同一个,所以组合数 = 排列数 ÷ 重复倍数。这个「先多数、再除掉对称」的动作,是整个计数学的核心招式(over-count then divide),你会在群论、概率、统计物理里一次次见到它。
$n!$(n 的阶乘)是把 $n$ 个东西排成一队的总数。$P(n,k)$ 排前 $k$ 个,所以除掉「剩下 $n-k$ 个怎么排」的 $(n-k)!$。组合数 $\binom{n}{k}$(读作「n 选 k」)在排列基础上,再除掉小组内部的 $k!$ 种顺序。三个阶乘,对应「全体 / 没选的 / 选中却不计顺序的」三层对称。
把组合数排成三角形——帕斯卡三角形——每个数恰好是上方两数之和。递推 $\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}$ 有个透亮解释:「选不选第 $n$ 个元素」把所有选法一刀切成两类。更惊艳的是左右对称 $\binom{n}{k}=\binom{n}{n-k}$(选 $k$ 个 = 扔掉 $n-k$ 个),以及它就是 $(a+b)^n$ 的展开系数——一个纯「分东西」的计数问题,竟长出整套代数。同一个真相在三种语言里显形:递推、对称、二项式。
二项分布 $\binom{n}{k}p^k(1-p)^{n-k}$ 直接建立在组合数上——抛 $n$ 次硬币恰好 $k$ 次正面,有 $\binom{n}{k}$ 种路径。纠错码(如 Reed–Muller)用组合计数确定能纠几位错;密码学用排列空间 $n!$ 的天文数字保证暴力破解不可行;机器学习里的特征交叉、$k$ 折交叉验证的划分数,本质都是组合计数。连 Transformer 里多头注意力「哪些位置看哪些位置」的连接模式,也是组合结构在起作用。
把 13 只鸽子塞进 12 个笼子,必然有一个笼子里至少 2 只。废话吗?它确实不可辩驳——但正因如此,它成了证明「某种东西必然存在」的最强杠杆。
威力在于:不需要把东西找出来,就能断定它存在。北京有两千多万人,而一个人头发不超过约 15 万根。把人当鸽子、「头发根数」当笼子——人远多于笼子,所以北京一定有两人头发根数完全相同。我们说不出是谁,却 100% 确定他们存在。这种「确定存在但拒绝指认」的姿态,是组合数学最迷人的特产。
若把 $n$ 个物体放进 $m$ 个盒子且 $n>m$,则至少一个盒子里有不少于 $\lceil n/m \rceil$ 个物体($\lceil\cdot\rceil$ 是向上取整)。证明只需一句反证:若每个盒子都不超过 $\lceil n/m\rceil-1$ 个,总数就 $
它把「存在性」和「构造性」彻底分开。你不必造出对象,只需让数量发生碰撞。这种思想孕育了整个 Ramsey 理论:「足够大的混乱中,必然涌现秩序」——比如 6 个人里,必有 3 人互相都认识、或 3 人互相都不认识。混乱无法贯彻到底,结构总会从规模中自发析出。这是一种近乎哲学的数学美:有序不是被安排的,而是被规模逼出来的。
哈希表的冲突必然存在——把无穷多可能的键映到有限桶里,鸽笼保证撞车,这是为什么哈希函数只能减少冲突而不能消灭它。同理,无损压缩不可能对所有文件都缩小:长度 $\le n$ 的文件比长度 $
会下棋的有 18 人,会游泳的有 15 人,会下棋或游泳的有几人?不能直接 $18+15$——因为两样都会的人被数了两遍,要把重复部分减掉一次。
三个集合更微妙:加上三个单独的,两两相交各多数一次要减掉,可三者共同的部分先被加 3 次又被减 3 次、归零了,得再补加 1 次。加 → 减 → 加,正负交替,像一支自我纠错的会计队伍:每层修正都在弥补上一层的过度修正,最终账目分毫不差。
一般式:$\left|\bigcup_i A_i\right| = \sum_k (-1)^{k-1} \sum_{|S|=k}\left|\bigcap_{i\in S} A_i\right|$。看着吓人,读法很简单:把所有「$k$ 个集合的交集」大小加起来,奇数个集合时取正、偶数个取负。那个 $(-1)^{k-1}$ 就是「加减加减」的开关。
正负号的交替不是凑出来的,它精确对应「一个元素被重复计数的次数」如何在二项式展开里相互抵消,背后正是恒等式 $\sum_k (-1)^k\binom{m}{k}=0$ 在保驾。最迷人的应用是错排问题:$n$ 封信全部装错信封的概率,当 $n$ 增大竟收敛到 $1/e\approx 0.368$。一个纯离散的「装信封」游戏,极限里钻出了自然常数 $e$——组合与分析在此握手,这正是 Hardy 所说「深刻」的标志。
数论的埃拉托斯特尼筛法本质就是容斥:要数 1 到 $N$ 中的素数,减去 2 的倍数、3 的倍数……再把「既是 2 又是 3 的倍数」加回来——欧拉函数 $\varphi(n)$ 的公式正由此而来(容斥 ↔ 数论筛法)。数据库查询优化器用它估算 `OR` 条件的结果集大小;概率里算「至少一个事件发生」靠它;可靠性工程中算「系统至少一条链路通」也靠它。
Herbert Wilf 有句名言:「生成函数是一根晾衣绳,我们把一串数字挂在上面展示。」 把数列 $a_0, a_1, a_2, \dots$ 写成幂级数 $a_0 + a_1 x + a_2 x^2 + \cdots$ 的系数——$x$ 不代表任何数值,只是一根给每个位置编号的衣架。
有什么用?神奇之处在于:组合上的「拼接」,变成了代数上的「相乘」。把两个东西的选法合并,对应两个生成函数相乘;多项式乘法会自动帮你把所有搭配逐项配对求和。于是「数有多少种组合」这个离散脑力活,被翻译成「展开函数、读出系数」的机械代数活——难题换一种语言后,自己解开了。
$a_n$ 是你关心的计数序列(第 $n$ 项有几种),$x^n$ 是它的「地址标签」。我们几乎从不把数代进 $x$、也不问级数收不收敛——它是形式幂级数,只是数列的一件代数外衣。关键身份对照:数列卷积 $\leftrightarrow$ 函数相乘;移位 $\leftrightarrow$ 乘 $x$;线性递推 $\leftrightarrow$ 一个有理函数方程。
它在离散与连续之间架了一座桥。斐波那契数列由递推 $F_n=F_{n-1}+F_{n-2}$ 定义,看似只能一项项往下算;可一旦写成生成函数,递推变成方程 $G(x)=\frac{x}{1-x-x^2}$,再做部分分式分解,竟直接吐出闭式 Binet 公式——黄金比例 $\varphi$ 赫然出现在指数上。一个整数数列的灵魂里,住着一个无理数。这正是 3Blue1Brown 式的惊叹:把问题搬到正确的舞台(这里是代数/分析的舞台),结构就自己显形了。
概率里的母函数 $E[x^X]$ 让「求多个随机变量之和的分布」从繁琐的卷积变成简单的相乘,是排队论、分支过程的利器。算法分析(Knuth《Concrete Mathematics》)用它求解递归式的精确复杂度。而在统计物理,配分函数 $Z=\sum_s e^{-\beta E_s}$ 就是一个生成函数——所有热力学量都靠对它求导得到(生成函数 ↔ 配分函数),这条线一路通向机器学习的能量模型与 softmax。