8.14.1 ACM-ICPC 组合数学 排列组合

8.14.1 ACM-ICPC 组合数学:排列组合

引言

排列组合是组合数学中的基础内容。在解决实际问题和竞赛编程中,它们都扮演着重要角色。排列是指从给定的元素中按一定顺序取出若干元素进行排序;组合则是从给定的元素中取出若干元素,不考虑顺序。排列组合的核心问题是研究满足特定条件的排列和组合的数量。它与古典概率论有着密切的联系。

加法与乘法原理

加法原理

完成一个工程可以有 nnn 种方法,记第 iii 种方法的数量为 ai(1≤i≤n)a_i (1 \le i \le n)ai​(1≤i≤n)。那么完成这件事情共有 S=a1+a2+⋯+anS = a_1 + a_2 + \cdots + a_nS=a1​+a2​+⋯+an​ 种不同的方法。

乘法原理

完成一个工程需要分 nnn 个步骤,记第 iii 个步骤的不同方法数为 ai(1≤i≤n)a_i (1 \le i \le n)ai​(1≤i≤n)。那么完成这件事情共有 S=a1×a2×⋯×anS = a_1 \times a_2 \times \cdots \times a_nS=a1​×a2​×⋯×an​ 种不同的方法。

排列与组合基础

排列数

从 nnn 个不同元素中,任取 m(m≤n)m (m \le n)m(m≤n) 个元素按照一定的顺序排成一列,称为从 nnn 个不同元素中取出 mmm 个元素的一个排列;所有这些排列的个数称为排列数,用符号 Anm\mathrm{A}_n^mAnm​ 或 Pnm\mathrm{P}_n^mPnm​ 表示。

排列的计算公式为:

Anm=n(n−1)(n−2)⋯(n−m+1)=n!(n−m)!\mathrm{A}_n^m = n(n-1)(n-2) \cdots (n-m+1) = \frac{n!}{(n - m)!}Anm​=n(n−1)(n−2)⋯(n−m+1)=(n−m)!n!​

这里,n!n!n! 代表 nnn 的阶乘,即 6!=1×2×3×4×5×66! = 1 \times 2 \times 3 \times 4 \times 5 \times 66!=1×2×3×4×5×6。

公式可以这样理解:从 nnn 个人中选 mmm 个人排队,第一个位置可以选 nnn 个人,第二个位置可以选 n−1n-1n−1 个人,以此类推,第 mmm 个位置可以选 n−m+1n-m+1n−m+1 个人。

全排列

全排列是排列数的一个特殊情况,当 m=nm = nm=n 时,即从 nnn 个人中选 nnn 个人排队:

Ann=n(n−1)(n−2)⋯1=n!\mathrm{A}_n^n = n(n-1)(n-2) \cdots 1 = n!Ann​=n(n−1)(n−2)⋯1=n!

组合数

从 nnn 个不同元素中,任取 m(m≤n)m (m \le n)m(m≤n) 个元素组成一个集合,称为从 nnn 个不同元素中取出 mmm 个元素的一个组合;所有这些组合的个数称为组合数,用符号 (nm)\binom{n}{m}(mn​) 表示,读作「nnn 选 mmm」。

组合数的计算公式为:

如何理解上述公式?我们考虑从 nnn 个人中选 mmm 个人,不排队,不在乎顺序。如果在乎顺序,那么就是排列数 Anm\mathrm{A}_n^mAnm​,如果不在乎顺序,那么就要除去重复排列的数量,这些重复排列数量为 m!m!m!。因此有:

所以得:

插板法

插板法(Stars and Bars)是一种求解分配问题和不定方程整数解的技巧。

正整数和的数目

问题:将 nnn 个完全相同的元素分成 kkk 组,每组至少有一个元素,有多少种分法?

解法:可以在 nnn 个元素之间插入 k−1k-1k−1 个板子,将元素分成 kkk 组。因此,答案是 (n−1k−1)\binom{n-1}{k-1}(k−1n−1​)。

非负整数和的数目

问题:将 nnn 个完全相同的元素分成 kkk 组,每组可以为空,有多少种分法?

解法:可以先借 kkk 个元素,再在 n+kn+kn+k 个元素之间插入 k−1k-1k−1 个板子,然后减去借来的 kkk 个元素。因此,答案是 (n+k−1k−1)\binom{n+k-1}{k-1}(k−1n+k−1​)。

不同下界整数和的数目

问题:如果对每组的元素数量设定下限,即每组至少分到 aia_iai​ 个元素,总和不超过 nnn,有多少种分法?

解法:可以借 ∑ai\sum a_i∑ai​ 个元素,保证第 iii 组至少有 aia_iai​ 个元素,将问题转化为非负整数和的问题:

排列组合进阶

多重集的排列数与组合数

多重集是指包含重复元素的集合。设 S={n1⋅a1,n2⋅a2,⋯ ,nk⋅ak}S = \{n_1 \cdot a_1, n_2 \cdot a_2, \cdots, n_k \cdot a_k\}S={n1​⋅a1​,n2​⋅a2​,⋯,nk​⋅ak​} 表示由 n1n_1n1​ 个 a1a_1a1​、n2n_2n2​ 个 a2a_2a2​ 等组成的多重集。多重集的排列数为:

圆排列

将 nnn 个人排成一圈,所有的排列数记为 Qnn\mathrm{Q}_n^nQnn​。考虑从不同位置断开后又形成不同的队列,因此有:

部分圆排列的公式为:

组合数性质

组合数在竞赛编程中非常重要,因此介绍一些常见性质:

  1. 对称性:

  1. 递推公式:

  1. 杨辉三角公式:

  1. 二项式定理:

  1. 二项式定理的特殊情况:

这些性质可以用于优化算法,快速计算组合数,提高编程竞赛中的解题效率。

二项式反演

二项式反演是一种重要的数学工具,用于在组合数学中转换不同的计数问题。记 fnf_nfn​ 表示恰好使用 nnn 个不同元素形成特定结构的方案数,gng_ngn​ 表示从 nnn 个不同元素中选出 i≥0i \geq 0i≥0 个元素形成特定结构的总方案数。

若已知 fnf_nfn​ 求 gng_ngn​

若已知 gng_ngn​ 求 fnf_nfn​

上述已知 gng_ngn​ 求 fnf_nfn​ 的过程,就称为二项式反演。

证明过程

将反演公式的 gig_igi​ 展开得到:

先枚举 jjj,再枚举 iii,得到:

使用「组合数性质」中的公式 (11) 得到:

令 k=i−jk = i - jk=i−j,则 i=k+ji = k + ji=k+j,上式转换为:

使用「组合数性质」中的公式 (5) 得到:

证毕。

结论

通过对排列组合的基础知识和高级应用的学习,能够更好地理解和解决组合数学中的各种问题。这些知识不仅在数学研究中具有重要意义,在竞赛编程中也是不可或缺的工具。希望本文能帮助读者更好地掌握排列组合的相关内容,为实际应用和竞赛解题提供有力支持。

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值