数论:组合数学与计数原理
数论:组合数学与计数原理
目录
1. 计数原理与计数方法
1.1 排列数与组合数
排列数(Permutation)
从 \(n\) 个不同元素中取出 \(m\) 个,按一定顺序排成一列的方案数:
关键:有序。选出的顺序不同则方案不同。
组合数(Combination)
从 \(n\) 个不同元素中取出 \(m\) 个,组成一个集合(不计顺序)的方案数:
关键:无序。选出的元素相同则视为同一方案,与顺序无关。
二者关系
即:先选后排。先从 \(n\) 个中选 \(m\) 个(组合),再把这 \(m\) 个排列(\(m!\))。
基本性质
| 性质 | 公式 | 说明 |
|---|---|---|
| 对称性 | \(\dbinom{n}{m} = \dbinom{n}{n-m}\) | 补集思想 |
| 边界 | \(\dbinom{n}{0} = \dbinom{n}{n} = 1\) | 空集唯一 |
| 零值 | \(\dbinom{n}{m} = 0\ (m > n)\) | 选不出比 \(n\) 多的 |
| 递推 | \(\dbinom{n}{m} = \dbinom{n-1}{m} + \dbinom{n-1}{m-1}\) | 核心递推 |
1.2 组合数的三种计算方法
方法 1:递推法(杨辉三角)
原理
利用组合数的递推公式:
含义:考虑第 \(n\) 个元素的去留——
- 若不选第 \(n\) 个元素,则从剩余 \(n-1\) 个中选 \(m\) 个:\(\binom{n-1}{m}\);
- 若选第 \(n\) 个元素,则从剩余 \(n-1\) 个中再选 \(m-1\) 个:\(\binom{n-1}{m-1}\)。
二者相加即为从 \(n\) 个中选 \(m\) 个的总方案数。
杨辉三角
将 \(\binom{n}{m}\) 排成三角形,每个数等于其正上方与左上方之和:
n=0: 1
n=1: 1 1
n=2: 1 2 1
n=3: 1 3 3 1
n=4: 1 4 6 4 1
n=5: 1 5 10 10 5 1
代码(\(O(n^2)\) 预处理,\(O(1)\) 查询)
const int MAXN = 2005;
long long C[MAXN][MAXN];
const int MOD = 1e9 + 7;
void init(int n) {
for (int i = 0; i <= n; i++) {
C[i][0] = 1;
for (int j = 1; j <= i; j++)
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % MOD;
// C[i][j] = 0 for j > i (默认为 0)
}
}
// 查询: C[n][m]
适用场景
| 条件 | 说明 |
|---|---|
| \(n\) 较小 | 一般 \(n \le 2000\)(\(n^2\) 可接受) |
| 模数任意 | 不要求模数为质数,这是其最大优势 |
| 需要多次查询 | 预处理后 \(O(1)\) 查询 |
优势:当模数不是质数(如 \(p = 10^9+7\) 的某些变体或 \(p\) 为合数)时,逆元法失效,递推法仍然可用。
方法 2:定义法(阶乘 + 逆元,最高频)
原理
当模数 \(p\) 为质数时,利用费马小定理求逆元:
费马小定理:若 \(p\) 为质数且 \(\gcd(a, p) = 1\),则 \(a^{p-1} \equiv 1 \pmod{p}\),即 \(a^{-1} \equiv a^{p-2} \pmod{p}\)。
因此:
预处理步骤
- 预处理阶乘数组:\(\text{fact}[i] = i! \bmod p\)
- 预处理阶乘逆元数组:\(\text{inv\_fact}[i] = (i!)^{-1} \bmod p\)
- 组合数计算:
优化技巧:线性递推逆元
直接对每个 \(\text{fact}[i]\) 用快速幂求逆元,复杂度 \(O(n \log p)\)。但可以优化到 \(O(n)\):
- 先用快速幂求出 \(\text{inv\_fact}[n] = (\text{fact}[n])^{p-2} \bmod p\);
- 再倒推:
推导:因为 \(\text{inv\_fact}[i] = (i!)^{-1}\),而 \((i-1)! = i! / i\),所以:
代码(\(O(n + \log p)\) 预处理,\(O(1)\) 查询)
const int MAXN = 2e6 + 5;
const int MOD = 1e9 + 7; // 质数
long long fact[MAXN], inv_fact[MAXN];
long long qpow(long long a, long long b, long long p) {
long long res = 1;
a %= p;
while (b > 0) {
if (b & 1) res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
void init(int n) {
fact[0] = 1;
for (int i = 1; i <= n; i++)
fact[i] = fact[i-1] * i % MOD;
inv_fact[n] = qpow(fact[n], MOD - 2, MOD); // 费马小定理求逆元
for (int i = n - 1; i >= 0; i--)
inv_fact[i] = inv_fact[i+1] * (i + 1) % MOD; // 倒推
}
long long C(int n, int m) {
if (m < 0 || m > n) return 0;
return fact[n] * inv_fact[m] % MOD * inv_fact[n - m] % MOD;
}
适用场景
| 条件 | 说明 |
|---|---|
| 模数为质数 | 必须,否则费马小定理不适用 |
| \(n\) 较大 | 一般 \(n \le 10^6\) 甚至更大 |
| 需要多次查询 | 预处理后 \(O(1)\) 查询 |
| 最通用 | 算法竞赛中最常见的写法 |
注意:要求 \(n < p\)(否则阶乘中会出现 \(p\) 的倍数,逆元不存在)。若 \(n \ge p\),需用 Lucas 定理。
方法对比总结
| 方法 | 预处理复杂度 | 查询复杂度 | 空间 | 模数要求 | \(n\) 的范围 |
|---|---|---|---|---|---|
| 递推法(杨辉三角) | \(O(n^2)\) | \(O(1)\) | \(O(n^2)\) | 任意 | \(\le 2000\) |
| 阶乘+逆元 | \(O(n+\log p)\) | \(O(1)\) | \(O(n)\) | 质数 | \(\le 10^6\),且 \(n < p\) |
2. 计数方法(捆绑 / 插空 / 隔板)
这是解决排列组合应用题的三大经典技巧,核心思想是将复杂问题转化为标准模型。
2.1 相邻元素捆绑法
适用场景
要求某些元素必须相邻(排在一起)。
步骤
- 捆绑:将必须相邻的 \(k\) 个元素视为一个整体("超级元素");
- 排序:将这个整体与其他元素一起全排列;
- 内部排序:被捆绑的 \(k\) 个元素内部也要全排列(\(k!\));
- 相乘:总方案数 = 整体排列数 × 内部排列数。
公式
若 \(k\) 个元素必须相邻,共 \(n\) 个元素:
示例
5 人站一排,A 和 B 必须相邻,有多少种排法?
- 将 A、B 捆绑为 1 个整体,现在共 \(5-2+1 = 4\) 个"元素";
- 整体排列:\(4! = 24\);
- A、B 内部排列:\(2! = 2\);
- 总方案数:\(24 \times 2 = 48\)。
多组捆绑
若有多组需要相邻的元素,分别捆绑、各自内部全排列,再一起全排列:
2.2 不相邻元素插空法
适用场景
要求某些元素互不相邻(任意两个之间至少有一个其他元素)。
步骤
- 先排其他元素:将没有不相邻要求的元素先排好;
- 找空隙:排好后形成若干"空隙"(包括两端),\(m\) 个元素排好后有 \(m+1\) 个空隙;
- 插入:将要求不相邻的元素插入这些空隙中,选位置并排列。
公式
若有 \(n\) 个元素,其中 \(k\) 个必须互不相邻,其余 \(n - k\) 个无限制:
注意:要求 \(k \le n - k + 1\),否则无解(空位不够)。
示例
5 人站一排,A 和 B 不相邻,有多少种排法?
- 先排其余 3 人:\(3! = 6\) 种;
- 3 人排好后形成 \(3 + 1 = 4\) 个空隙(含两端);
- 从 4 个空隙中选 2 个放 A、B 并排列:\(A_4^2 = 4 \times 3 = 12\);
- 总方案数:\(6 \times 12 = 72\)。
验证(总 - 相邻)
总排列 \(5! = 120\),A、B 相邻 \(48\) 种,不相邻 \(= 120 - 48 = 72\)。✅
2.3 相同元素隔板法
适用场景
将完全相同的物品分给不同的对象,每人至少分一个(或推广形式)。
基本模型
将 \(n\) 个相同的球放入 \(k\) 个不同的盒子,每个盒子至少一个球,求方案数。
方法:将 \(n\) 个球排成一排,中间有 \(n - 1\) 个间隙,从中选 \(k - 1\) 个位置插入"隔板",将球分为 \(k\) 组:
示例
10 个相同的苹果分给 3 个小朋友,每人至少 1 个,多少种分法?
推广:允许为 0(转化为非负整数解)
若盒子可以为空(每人可以分 0 个),等价于求 \(x_1 + x_2 + \cdots + x_k = n\) 的非负整数解数。
技巧:先给每个盒子虚放 1 个球(共 \(k\) 个),问题转化为 \(n + k\) 个球、每盒至少 1 个:
详细推导见 第 8 节:不定方程的解数问题。
推广:下界限制
若第 \(i\) 个盒子至少 \(a_i\) 个,先给每个盒子预放 \(a_i\) 个,剩余 \(n - \sum a_i\) 个自由分配(允许为 0):
三大方法对比
| 方法 | 适用场景 | 核心操作 | 典型公式 |
|---|---|---|---|
| 捆绑法 | 元素必须相邻 | 先捆后排 | \((n-k+1)! \times k!\) |
| 插空法 | 元素互不相邻 | 先排再插空 | \(A_{n-k+1}^k \times (n-k)!\) |
| 隔板法 | 相同元素分组 | 插隔板分组 | \(\binom{n-1}{k-1}\) |
3. 重要恒等式
组合数有大量优美的恒等式,它们是简化复杂求和、推导递推关系的利器。
3.1 对称恒等式
含义:从 \(n\) 个中选 \(m\) 个,等价于选 \(n - m\) 个不选的(补集思想)。
3.2 吸收 / 提取恒等式
推导:
用途:在求和中"吸收"或"提取"变量,化简含有 \(m\binom{n}{m}\) 的求和式。
变体:
3.3 上指标求和恒等式
含义:从 \(0\) 到 \(n\),依次选 \(\binom{i}{m}\),总和等于 \(\binom{n+1}{m+1}\)。
组合证明:\(\binom{n+1}{m+1}\) 表示从 \(n+1\) 个元素中选 \(m+1\) 个。按选出的最大元素分类——若最大元素是第 \(i+1\) 个(\(i\) 从 \(m\) 到 \(n\)),则在前 \(i\) 个中选 \(m\) 个,方案数 \(\binom{i}{m}\)。求和即得。
也称为曲棍球恒等式(Hockey Stick Identity),因为杨辉三角中求和的路径形似曲棍球杆。
3.4 范德蒙德卷积 / 下指标卷积
含义:从 \(n\) 个男生和 \(m\) 个女生中选 \(k\) 人,按选 \(i\) 个男生、\(k-i\) 个女生分类求和,等于直接从 \(n+m\) 人中选 \(k\) 人。
3.5 上指标卷积
含义:在 \(n+1\) 个位置中选 \(a+b+1\) 个,按"分界点 \(i\)"分类——前 \(i\) 个中选 \(a\) 个,后 \(n-i\) 个中选 \(b\) 个。
与范德蒙德的关系:令 \(j = i\),这是范德蒙德卷积的另一种形式(上指标求和版)。
恒等式速查表
| 名称 | 公式 | 一句话理解 |
|---|---|---|
| 对称 | \(\binom{n}{m}=\binom{n}{n-m}\) | 选 = 不选 |
| 吸收 | \(\binom{n}{m}=\frac{n}{m}\binom{n-1}{m-1}\) | 提取 \(n/m\) |
| 上指标求和 | \(\sum_{i=0}^n\binom{i}{m}=\binom{n+1}{m+1}\) | 曲棍球 |
| 范德蒙德 | \(\sum_i\binom{n}{i}\binom{m}{k-i}=\binom{n+m}{k}\) | 两组并一组 |
| 上指标卷积 | \(\sum_i\binom{i}{a}\binom{n-i}{b}=\binom{n+1}{a+b+1}\) | 分界分类 |
4. 二项式定理
定理内容
对任意实数 \(a, b\) 和非负整数 \(n\):
其中 \(\binom{n}{k}\) 称为二项式系数。
组合理解
\((a+b)^n\) 是 \(n\) 个 \((a+b)\) 相乘,每个因子中选 \(a\) 或 \(b\)。展开式中 \(a^{n-k}b^k\) 的系数,就是从 \(n\) 个因子中选 \(k\) 个取 \(b\)(其余取 \(a\))的方案数,即 \(\binom{n}{k}\)。
特殊情形
| 取值 | 结果 | 说明 |
|---|---|---|
| \(a=1,\ b=1\) | \(\displaystyle\sum_{k=0}^{n}\binom{n}{k} = 2^n\) | 子集总数 |
| \(a=1,\ b=-1\) | \(\displaystyle\sum_{k=0}^{n}(-1)^k\binom{n}{k} = 0\) | 奇偶项抵消 |
| \(a=1,\ b=x\) | \((1+x)^n = \displaystyle\sum_{k=0}^{n}\binom{n}{k}x^k\) | 生成函数形式 |
例:展开 \((a+b)^4\)
系数 \(1, 4, 6, 4, 1\) 正是杨辉三角第 4 行。
5. 二项式定理的直接推论
推论 1:子集总数
含义:\(n\) 元素的集合的所有子集(包括空集和全集)总数为 \(2^n\)。
证明:令 \(a = b = 1\),\((1+1)^n = 2^n\)。
推论 2:奇偶项之差为零
含义:\(\binom{n}{0} + \binom{n}{2} + \binom{n}{4} + \cdots = \binom{n}{1} + \binom{n}{3} + \binom{n}{5} + \cdots = 2^{n-1}\)。
证明:令 \(a = 1, b = -1\),\((1-1)^n = 0\)。
推论:偶数大小的子集个数 = 奇数大小的子集个数 = \(2^{n-1}\)。
推论 3:平方和恒等式
证明:由范德蒙德卷积,\(\sum_k \binom{n}{k}\binom{n}{n-k} = \binom{2n}{n}\),而 \(\binom{n}{n-k} = \binom{n}{k}\)。
含义:从 \(2n\) 个人中选 \(n\) 人,等于两组各 \(n\) 人中分别选 \(k\) 和 \(n-k\) 人再求和。
推论 4:求和 \(\sum k\binom{n}{k}\)
证明(用吸收恒等式):
推论 5:求和 \(\sum k^2\binom{n}{k}\)
推论速查表
| 推论 | 公式 | 令 |
|---|---|---|
| 子集总数 | \(\sum\binom{n}{k}=2^n\) | \(a=b=1\) |
| 奇偶抵消 | \(\sum(-1)^k\binom{n}{k}=0\) | \(a=1,b=-1\) |
| 平方和 | \(\sum\binom{n}{k}^2=\binom{2n}{n}\) | 范德蒙德 |
| 加权和 | \(\sum k\binom{n}{k}=n\cdot 2^{n-1}\) | 吸收恒等式 |
6. Lucas 定理
定理内容
设 \(p\) 为质数,\(n, m\) 为非负整数。将 \(n, m\) 用 \(p\) 进制表示:
则:
即:\(\binom{n}{m} \bmod p\) 等于 \(n\) 和 \(m\) 的各 \(p\) 进制位对应组合数的乘积。
递推形式
更常用的写法:
适用场景
| 场景 | 说明 |
|---|---|
| \(n, m\) 很大 | 如 \(n, m \le 10^{18}\) |
| 模数 \(p\) 较小且为质数 | 如 \(p \le 10^5\) |
| \(n \ge p\) | 此时阶乘逆元法失效(阶乘含 \(p\) 的倍数) |
代码
const int MOD = 1e9 + 7; // 这里以较小质数为例,实际 Lucas 多用于 p <= 1e5
long long qpow(long long a, long long b, long long p) {
long long res = 1; a %= p;
while (b > 0) {
if (b & 1) res = res * a % p;
a = a * a % p; b >>= 1;
}
return res;
}
// 预处理阶乘(模 p 内)
long long fact[100005];
void init(int p) {
fact[0] = 1;
for (int i = 1; i < p; i++)
fact[i] = fact[i-1] * i % p;
}
// 单次组合数(模 p 内,要求 n < p)
long long C_p(long long n, long long m, int p) {
if (m < 0 || m > n) return 0;
return fact[n] * qpow(fact[m], p-2, p) % p * qpow(fact[n-m], p-2, p) % p;
}
// Lucas 定理
long long lucas(long long n, long long m, int p) {
if (m == 0) return 1;
return C_p(n % p, m % p, p) * lucas(n / p, m / p, p) % p;
}
递归深度
Lucas 定理的递归深度为 \(O(\log_p n)\),即 \(n\) 的 \(p\) 进制位数。
例题
求 \(\binom{10^{18}}{10^{18}-1} \bmod 3\)。
由 Lucas 定理,不断取 \(p=3\) 进制分解,最终化为若干 \(\binom{n_i}{m_i} \bmod 3\) 的乘积,其中每个 \(n_i, m_i < 3\)。
7. 组合数的单调性
单峰性
对于固定的 \(n\),\(\binom{n}{k}\) 关于 \(k\) 是先增后减的(单峰),在 \(k = \lfloor n/2 \rfloor\) 附近取最大值。
比值法证明
- 当 \(\frac{n-k+1}{k} > 1\),即 \(k < \frac{n+1}{2}\) 时,\(\binom{n}{k}\) 递增;
- 当 \(k > \frac{n+1}{2}\) 时,递减;
- \(n\) 为偶数时,\(k = n/2\) 处取唯一最大值 \(\binom{n}{n/2}\);
- \(n\) 为奇数时,\(k = (n-1)/2\) 和 \(k = (n+1)/2\) 处并列最大。
应用
- 求最大组合数:\(\max_k \binom{n}{k} = \binom{n}{\lfloor n/2 \rfloor}\);
- 二分 / 三分优化:当需要找满足某条件的 \(k\) 时,利用单调性优化;
- 放缩估计:\(\binom{n}{k} \le \binom{n}{\lfloor n/2 \rfloor}\)。
关于 \(n\) 的单调性
对于固定的 \(k \ge 1\),\(\binom{n}{k}\) 关于 \(n\) 严格递增:
由 \(\binom{n+1}{k} = \binom{n}{k} + \binom{n}{k-1} > \binom{n}{k}\) 即得。
8. 不定方程的解数问题
这是隔板法的系统化应用。考虑不定方程:
8.1 正整数解(每变量 \(\ge 1\))
条件:\(x_i \ge 1\)(正整数),\(n \ge k\)。
方法:\(n\) 个相同球排成一排,\(n-1\) 个间隙中插 \(k-1\) 个隔板,分为 \(k\) 组(每组至少 1 个):
示例
\(x_1 + x_2 + x_3 = 10\),\(x_i \ge 1\) 的正整数解个数?
8.2 非负整数解(每变量 \(\ge 0\))
条件:\(x_i \ge 0\)(非负整数)。
方法:令 \(y_i = x_i + 1\),则 \(y_i \ge 1\),方程变为 \(y_1 + \cdots + y_k = n + k\),化为正整数解问题:
直观理解:\(n\) 个相同球放入 \(k\) 个不同盒子,允许空盒。先给每盒虚放 1 个(共 \(k\)),再按正整数解处理。
示例
\(x_1 + x_2 + x_3 = 10\),\(x_i \ge 0\) 的非负整数解个数?
8.3 下界限制(\(x_i \ge a_i\))
条件:\(x_i \ge a_i\)(\(a_i\) 为给定常数)。
方法:令 \(y_i = x_i - a_i \ge 0\),方程变为 \(y_1 + \cdots + y_k = n - \sum a_i\),化为非负整数解:
要求 \(n \ge \sum a_i\),否则无解。
示例
\(x_1 + x_2 + x_3 = 10\),\(x_1 \ge 2,\ x_2 \ge 3,\ x_3 \ge 1\)。
\(\sum a_i = 2+3+1 = 6\),剩余 \(10 - 6 = 4\) 自由分配:
8.4 上下界限制(\(a_i \le x_i \le b_i\))
条件:\(a_i \le x_i \le b_i\)。
方法:容斥原理。先去掉下界(令 \(y_i = x_i - a_i \ge 0\)),得到上界 \(y_i \le b_i - a_i = c_i\),然后对上界进行容斥。
设去掉下界后方程为 \(y_1 + \cdots + y_k = N\)(\(N = n - \sum a_i\)),\(0 \le y_i \le c_i\)。
容斥:总方案 = 无上界限制的方案 − 至少一个变量越界的方案 + 至少两个越界 − ...
其中 \(S\) 是"越界"的变量集合,对 \(i \in S\),令 \(y_i' = y_i - (c_i + 1) \ge 0\)(即 \(y_i \ge c_i + 1\),超出上界)。
若 \(N - \sum_{i \in S}(c_i+1) < 0\),该项为 \(0\)。
示例
\(x_1 + x_2 + x_3 = 10\),\(0 \le x_1 \le 4,\ 0 \le x_2 \le 3,\ 0 \le x_3 \le 5\)。
\(N = 10\),\(c_1=4, c_2=3, c_3=5\)。容斥:
- 无限制:\(\binom{12}{2} = 66\)
- \(x_1 \ge 5\)(即 \(y_1 \ge 5\)):\(\binom{12-5}{2} = \binom{7}{2} = 21\)
- \(x_2 \ge 4\):\(\binom{12-4}{2} = \binom{8}{2} = 28\)
- \(x_3 \ge 6\):\(\binom{12-6}{2} = \binom{6}{2} = 15\)
- \(x_1 \ge 5, x_2 \ge 4\):\(\binom{12-5-4}{2} = \binom{3}{2} = 3\)
- \(x_1 \ge 5, x_3 \ge 6\):\(\binom{12-5-6}{2} = \binom{1}{2} = 0\)
- \(x_2 \ge 4, x_3 \ge 6\):\(\binom{12-4-6}{2} = \binom{2}{2} = 1\)
- 三者全越界:\(\binom{12-5-4-6}{2} = \binom{-3}{2} = 0\)
总结表
| 条件 | 解数公式 | 转化方法 |
|---|---|---|
| \(x_i \ge 1\) | \(\binom{n-1}{k-1}\) | 直接隔板 |
| \(x_i \ge 0\) | \(\binom{n+k-1}{k-1}\) | \(y_i = x_i + 1\) |
| \(x_i \ge a_i\) | \(\binom{n-\sum a_i+k-1}{k-1}\) | \(y_i = x_i - a_i\) |
| \(a_i \le x_i \le b_i\) | 容斥 | 去下界 + 容斥上界 |
9. 鸽巢原理
9.1 普通鸽巢原理
内容
将 \(n + 1\) 个物体放入 \(n\) 个盒子(鸽巢)中,则至少有一个盒子包含至少 \(2\) 个物体。
更一般地:
将 \(N\) 个物体放入 \(k\) 个盒子,则至少有一个盒子包含至少 \(\lceil N/k \rceil\) 个物体。
证明(反证法)
假设每个盒子最多 \(\lceil N/k \rceil - 1\) 个,则总数最多 \(k \cdot (\lceil N/k \rceil - 1) < N\),矛盾。
应用示例
例 1:任意 13 个人中,至少有 2 人生日在同一个月。
(13 人放入 12 个月,必有某月 \(\ge 2\) 人)
例 2:从 \(1\) 到 \(2n\) 的整数中任取 \(n+1\) 个,必有两个数其中一个整除另一个。
(按最大奇因子分类,共 \(n\) 类,取 \(n+1\) 个必有两数同类,较小者整除较大者)
例 3:\(n+1\) 个互不相同的、小于 \(2n\) 的正整数中,必有一个整除另一个。
例 4(前缀和):给定 \(n\) 个整数 \(a_1, \ldots, a_n\),存在连续子段之和为 \(n\) 的倍数。
(令 \(S_k = \sum_{i=1}^k a_i\),\(n+1\) 个前缀和 \(S_0, S_1, \ldots, S_n\) 对 \(n\) 取模只有 \(n\) 种余数,必有两个同余,其差为 \(n\) 的倍数)
10. 容斥原理
基本思想
要计算至少满足一个性质的元素个数,先加上各自满足的,再减去两两都满足的,再加上三个都满足的,依此类交。
用补集转化:计算都不满足的元素个数 = 总数 − 至少满足一个的个数。
公式
设全集 \(U\),性质集合 \(A_1, A_2, \ldots, A_n\),\(|A_i|\) 表示满足性质 \(i\) 的元素个数。
至少满足一个性质的元素个数
用求和符号:
都不满足的元素个数
即:
其中 \(S = \emptyset\) 时为 \(|U|\)。
二集合、三集合情形
二集合:
三集合:
子集枚举实现
竞赛中常用位运算枚举子集实现容斥:
// n 个性质,f(S) = 满足 S 中所有性质的元素个数
// 求至少满足一个性质的元素个数
long long inclusion_exclusion(int n, function<long long(int)> f) {
long long ans = 0;
for (int S = 1; S < (1 << n); S++) {
int bits = __builtin_popcount(S);
if (bits % 2 == 1) ans += f(S); // 奇数个:加
else ans -= f(S); // 偶数个:减
}
return ans;
}
// 求都不满足的元素个数 = |U| - 上式
经典应用
应用 1:错排问题
\(n\) 封信装入 \(n\) 个信封,全部装错的方案数 \(D_n\)。
方法:全集 = \(n!\)(所有排列),\(A_i\) = 第 \(i\) 封信装对。求都不装对的方案数:
递推:\(D_n = (n-1)(D_{n-1} + D_{n-2})\),\(D_1 = 0,\ D_2 = 1\)。
应用 2:欧拉函数
$\varphi(n) = $ 不超过 \(n\) 且与 \(n\) 互质的正整数个数。
设 \(n\) 的质因数为 \(p_1, p_2, \ldots, p_k\)。全集 \(U = \{1, 2, \ldots, n\}\),\(A_i\) = 被 \(p_i\) 整除的数。求都不被任何 \(p_i\) 整除的数:
应用 3:不定方程上下界(见第 8.4 节)
应用 4:第二类 Stirling 数(容斥公式)
将 \(n\) 个不同元素划分为恰好 \(k\) 个非空集合的方案数 \(S(n,k)\)。
应用 5:多重集组合数
从 \(k\) 种元素中选 \(n\) 个,第 \(i\) 种最多 \(c_i\) 个,求方案数。
去上界后容斥(类似第 8.4 节)。
容斥原理核心公式速查
| 问题 | 公式 |
|---|---|
| 至少满足一个 | $\sum_{\emptyset\ne S}(-1)^{ |
| 都不满足 | $\sum_{S}(-1)^{ |
| 错排 | \(D_n = n!\sum_{k=0}^n\frac{(-1)^k}{k!}\) |
| 欧拉函数 | \(\varphi(n) = n\prod(1-\frac{1}{p_i})\) |
| Stirling 数 | \(S(n,k)=\frac{1}{k!}\sum(-1)^i\binom{k}{i}(k-i)^n\) |
总结
| 主题 | 核心思想 | 竞赛中的关键应用 |
|---|---|---|
| 组合数计算 | 递推 / 逆元 / Lucas | \(O(1)\) 查询组合数 |
| 捆绑 / 插空 / 隔板 | 化复杂为标准模型 | 排列组合应用题 |
| 恒等式 | 化简求和式 | 推导递推、优化计算 |
| 二项式定理 | \((a+b)^n\) 展开 | 子集计数、求和 |
| Lucas 定理 | \(p\) 进制分解 | 大组合数取模 |
| 单调性 | 单峰性 | 优化、估计 |
| 不定方程解数 | 隔板法 + 容斥 | 分配问题 |
| 鸽巢原理 | 存在性证明 | 抽屉论证 |
| 容斥原理 | 补集 + 加减交替 | 去限制、求交并 |
部分由 AI 润色
原创·转载请注明出处
✦
浙公网安备 33010602011771号