文章目录

数论:组合数学与计数原理

数论:组合数学与计数原理


目录

  1. 计数原理与计数方法
  2. 计数方法(捆绑 / 插空 / 隔板)
  3. 重要恒等式
  4. 二项式定理
  5. 二项式定理的直接推论
  6. Lucas 定理
  7. 组合数的单调性
  8. 不定方程的解数问题
  9. 鸽巢原理
  10. 容斥原理

1. 计数原理与计数方法

1.1 排列数与组合数

排列数(Permutation)

\(n\)不同元素中取出 \(m\) 个,按一定顺序排成一列的方案数:

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

关键有序。选出的顺序不同则方案不同。

组合数(Combination)

\(n\)不同元素中取出 \(m\) 个,组成一个集合(不计顺序)的方案数:

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

关键无序。选出的元素相同则视为同一方案,与顺序无关。

二者关系

\[A_n^m = \binom{n}{m} \times 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:递推法(杨辉三角)

原理

利用组合数的递推公式:

\[\binom{n}{m} = \binom{n-1}{m} + \binom{n-1}{m-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}\)

因此:

\[\binom{n}{m} = \frac{n!}{m!\,(n-m)!} \equiv n! \cdot (m!)^{-1} \cdot ((n-m)!)^{-1} \pmod{p} \]

预处理步骤
  1. 预处理阶乘数组\(\text{fact}[i] = i! \bmod p\)
  2. 预处理阶乘逆元数组\(\text{inv\_fact}[i] = (i!)^{-1} \bmod p\)
  3. 组合数计算

\[\binom{n}{m} = \text{fact}[n] \times \text{inv\_fact}[m] \times \text{inv\_fact}[n-m] \bmod p \]

优化技巧:线性递推逆元

直接对每个 \(\text{fact}[i]\) 用快速幂求逆元,复杂度 \(O(n \log p)\)。但可以优化到 \(O(n)\)

  1. 先用快速幂求出 \(\text{inv\_fact}[n] = (\text{fact}[n])^{p-2} \bmod p\)
  2. 倒推

\[\text{inv\_fact}[i-1] = \text{inv\_fact}[i] \times i \bmod p \]

推导:因为 \(\text{inv\_fact}[i] = (i!)^{-1}\),而 \((i-1)! = i! / i\),所以:

\[((i-1)!)^{-1} = (i!)^{-1} \cdot i \pmod{p} \]

代码(\(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 相邻元素捆绑法

适用场景

要求某些元素必须相邻(排在一起)。

步骤

  1. 捆绑:将必须相邻的 \(k\) 个元素视为一个整体("超级元素");
  2. 排序:将这个整体与其他元素一起全排列;
  3. 内部排序:被捆绑的 \(k\) 个元素内部也要全排列(\(k!\));
  4. 相乘:总方案数 = 整体排列数 × 内部排列数。

公式

\(k\) 个元素必须相邻,共 \(n\) 个元素:

\[\text{方案数} = (n - k + 1)! \times k! \]

示例

5 人站一排,A 和 B 必须相邻,有多少种排法?

  • 将 A、B 捆绑为 1 个整体,现在共 \(5-2+1 = 4\) 个"元素";
  • 整体排列:\(4! = 24\)
  • A、B 内部排列:\(2! = 2\)
  • 总方案数:\(24 \times 2 = 48\)

多组捆绑

若有多组需要相邻的元素,分别捆绑、各自内部全排列,再一起全排列:

\[\text{方案数} = (\text{总元素数})! \times \prod_{\text{每组}} (组内元素数)! \]


2.2 不相邻元素插空法

适用场景

要求某些元素互不相邻(任意两个之间至少有一个其他元素)。

步骤

  1. 先排其他元素:将没有不相邻要求的元素先排好;
  2. 找空隙:排好后形成若干"空隙"(包括两端),\(m\) 个元素排好后有 \(m+1\) 个空隙;
  3. 插入:将要求不相邻的元素插入这些空隙中,选位置并排列。

公式

若有 \(n\) 个元素,其中 \(k\) 个必须互不相邻,其余 \(n - k\) 个无限制:

\[\text{方案数} = (n-k)! \times A_{n-k+1}^{k} = (n-k)! \times \binom{n-k+1}{k} \times 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\) 组:

\[\text{方案数} = \binom{n-1}{k-1} \]

示例

10 个相同的苹果分给 3 个小朋友,每人至少 1 个,多少种分法?

\[\binom{10-1}{3-1} = \binom{9}{2} = 36 \]

推广:允许为 0(转化为非负整数解)

若盒子可以为空(每人可以分 0 个),等价于求 \(x_1 + x_2 + \cdots + x_k = n\)非负整数解数。

技巧:先给每个盒子虚放 1 个球(共 \(k\) 个),问题转化为 \(n + k\) 个球、每盒至少 1 个:

\[\text{方案数} = \binom{n+k-1}{k-1} \]

详细推导见 第 8 节:不定方程的解数问题

推广:下界限制

若第 \(i\) 个盒子至少 \(a_i\) 个,先给每个盒子预放 \(a_i\) 个,剩余 \(n - \sum a_i\) 个自由分配(允许为 0):

\[\text{方案数} = \binom{n - \sum a_i + k - 1}{k - 1} \]


三大方法对比

方法 适用场景 核心操作 典型公式
捆绑法 元素必须相邻 先捆后排 \((n-k+1)! \times k!\)
插空法 元素互不相邻 先排再插空 \(A_{n-k+1}^k \times (n-k)!\)
隔板法 相同元素分组 插隔板分组 \(\binom{n-1}{k-1}\)

3. 重要恒等式

组合数有大量优美的恒等式,它们是简化复杂求和、推导递推关系的利器。

3.1 对称恒等式

\[\boxed{\binom{n}{m} = \binom{n}{n-m}} \]

含义:从 \(n\) 个中选 \(m\) 个,等价于选 \(n - m\)不选的(补集思想)。


3.2 吸收 / 提取恒等式

\[\boxed{\binom{n}{m} = \frac{n}{m}\binom{n-1}{m-1}} \]

推导

\[\binom{n}{m} = \frac{n!}{m!(n-m)!} = \frac{n}{m} \cdot \frac{(n-1)!}{(m-1)!(n-m)!} = \frac{n}{m}\binom{n-1}{m-1} \]

用途:在求和中"吸收"或"提取"变量,化简含有 \(m\binom{n}{m}\) 的求和式。

变体

\[m\binom{n}{m} = n\binom{n-1}{m-1} \]


3.3 上指标求和恒等式

\[\boxed{\sum_{i=0}^{n}\binom{i}{m} = \binom{n+1}{m+1}} \]

含义:从 \(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 范德蒙德卷积 / 下指标卷积

\[\boxed{\sum_{i=0}^{k}\binom{n}{i}\binom{m}{k-i} = \binom{n+m}{k}} \]

含义:从 \(n\) 个男生和 \(m\) 个女生中选 \(k\) 人,按选 \(i\) 个男生、\(k-i\) 个女生分类求和,等于直接从 \(n+m\) 人中选 \(k\) 人。


3.5 上指标卷积

\[\boxed{\sum_{i=0}^{n}\binom{i}{a}\binom{n-i}{b} = \binom{n+1}{a+b+1}} \]

含义:在 \(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\)

\[\boxed{(a+b)^n = \sum_{k=0}^{n}\binom{n}{k}a^{n-k}b^k = \binom{n}{0}a^n + \binom{n}{1}a^{n-1}b + \cdots + \binom{n}{n}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\)

\[(a+b)^4 = \binom{4}{0}a^4 + \binom{4}{1}a^3b + \binom{4}{2}a^2b^2 + \binom{4}{3}ab^3 + \binom{4}{4}b^4 = a^4 + 4a^3b + 6a^2b^2 + 4ab^3 + b^4 \]

系数 \(1, 4, 6, 4, 1\) 正是杨辉三角第 4 行。


5. 二项式定理的直接推论

推论 1:子集总数

\[\boxed{\sum_{k=0}^{n}\binom{n}{k} = 2^n} \]

含义\(n\) 元素的集合的所有子集(包括空集和全集)总数为 \(2^n\)

证明:令 \(a = b = 1\)\((1+1)^n = 2^n\)


推论 2:奇偶项之差为零

\[\boxed{\sum_{k=0}^{n}(-1)^k\binom{n}{k} = 0 \quad (n \ge 1)} \]

含义\(\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:平方和恒等式

\[\boxed{\sum_{k=0}^{n}\binom{n}{k}^2 = \binom{2n}{n}} \]

证明:由范德蒙德卷积,\(\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}\)

\[\boxed{\sum_{k=0}^{n}k\binom{n}{k} = n \cdot 2^{n-1}} \]

证明(用吸收恒等式):

\[k\binom{n}{k} = n\binom{n-1}{k-1} \]

\[\sum_{k=1}^{n}k\binom{n}{k} = n\sum_{k=1}^{n}\binom{n-1}{k-1} = n\sum_{j=0}^{n-1}\binom{n-1}{j} = n \cdot 2^{n-1} \]


推论 5:求和 \(\sum k^2\binom{n}{k}\)

\[\boxed{\sum_{k=0}^{n}k^2\binom{n}{k} = n(n+1) \cdot 2^{n-2}} \]


推论速查表

推论 公式
子集总数 \(\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\) 进制表示:

\[n = n_k p^k + n_{k-1}p^{k-1} + \cdots + n_1 p + n_0 \]

\[m = m_k p^k + m_{k-1}p^{k-1} + \cdots + m_1 p + m_0 \]

则:

\[\boxed{\binom{n}{m} \equiv \prod_{i=0}^{k}\binom{n_i}{m_i} \pmod{p}} \]

即:\(\binom{n}{m} \bmod p\) 等于 \(n\)\(m\)\(p\) 进制位对应组合数的乘积。

递推形式

更常用的写法:

\[\boxed{\binom{n}{m} \equiv \binom{n \bmod p}{m \bmod p} \times \binom{\lfloor n/p \rfloor}{\lfloor m/p \rfloor} \pmod{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\) 附近取最大值。

\[\binom{n}{0} < \binom{n}{1} < \cdots < \binom{n}{\lfloor n/2 \rfloor} \ge \binom{n}{\lfloor n/2 \rfloor + 1} > \cdots > \binom{n}{n} \]

比值法证明

\[\frac{\binom{n}{k}}{\binom{n}{k-1}} = \frac{n-k+1}{k} \]

  • \(\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}{k} < \binom{n+1}{k} \quad (k \ge 1) \]

\(\binom{n+1}{k} = \binom{n}{k} + \binom{n}{k-1} > \binom{n}{k}\) 即得。


8. 不定方程的解数问题

这是隔板法的系统化应用。考虑不定方程:

\[x_1 + x_2 + \cdots + x_k = n \]

8.1 正整数解(每变量 \(\ge 1\)

条件\(x_i \ge 1\)(正整数),\(n \ge k\)

方法\(n\) 个相同球排成一排,\(n-1\) 个间隙中插 \(k-1\) 个隔板,分为 \(k\) 组(每组至少 1 个):

\[\boxed{\text{正整数解个数} = \binom{n-1}{k-1}} \]

示例

\(x_1 + x_2 + x_3 = 10\)\(x_i \ge 1\) 的正整数解个数?

\[\binom{10-1}{3-1} = \binom{9}{2} = 36 \]


8.2 非负整数解(每变量 \(\ge 0\)

条件\(x_i \ge 0\)(非负整数)。

方法:令 \(y_i = x_i + 1\),则 \(y_i \ge 1\),方程变为 \(y_1 + \cdots + y_k = n + k\),化为正整数解问题:

\[\boxed{\text{非负整数解个数} = \binom{n+k-1}{k-1} = \binom{n+k-1}{n}} \]

直观理解\(n\) 个相同球放入 \(k\) 个不同盒子,允许空盒。先给每盒虚放 1 个(共 \(k\)),再按正整数解处理。

示例

\(x_1 + x_2 + x_3 = 10\)\(x_i \ge 0\) 的非负整数解个数?

\[\binom{10+3-1}{3-1} = \binom{12}{2} = 66 \]


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\),化为非负整数解:

\[\boxed{\text{解个数} = \binom{n - \sum_{i=1}^{k}a_i + k - 1}{k - 1}} \]

要求 \(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\) 自由分配:

\[\binom{4 + 3 - 1}{3-1} = \binom{6}{2} = 15 \]


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\)

容斥:总方案 = 无上界限制的方案 − 至少一个变量越界的方案 + 至少两个越界 − ...

\[\text{解个数} = \sum_{S \subseteq \{1,\ldots,k\}} (-1)^{|S|} \binom{N - \sum_{i \in S}(c_i + 1) + k - 1}{k - 1} \]

其中 \(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\)

\[\text{答案} = 66 - 21 - 28 - 15 + 3 + 0 + 1 - 0 = 6 \]


总结表

条件 解数公式 转化方法
\(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\) 个物体。

\[\boxed{\text{某个盒子中至少 } \left\lceil \frac{N}{k} \right\rceil \text{ 个物体}} \]

证明(反证法)

假设每个盒子最多 \(\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\) 的元素个数。

至少满足一个性质的元素个数

\[\boxed{|A_1 \cup A_2 \cup \cdots \cup A_n| = \sum_{i}|A_i| - \sum_{i<j}|A_i \cap A_j| + \sum_{i<j<k}|A_i \cap A_j \cap A_k| - \cdots + (-1)^{n-1}|A_1 \cap \cdots \cap A_n|} \]

用求和符号:

\[\left|\bigcup_{i=1}^{n}A_i\right| = \sum_{\emptyset \ne S \subseteq [n]} (-1)^{|S|+1}\left|\bigcap_{i \in S}A_i\right| \]

都不满足的元素个数

\[\boxed{\left|\overline{A_1} \cap \overline{A_2} \cap \cdots \cap \overline{A_n}\right| = |U| - \sum_{i}|A_i| + \sum_{i<j}|A_i \cap A_j| - \cdots + (-1)^{n}|A_1 \cap \cdots \cap A_n|} \]

即:

\[= \sum_{S \subseteq [n]} (-1)^{|S|}\left|\bigcap_{i \in S}A_i\right| \]

其中 \(S = \emptyset\) 时为 \(|U|\)

二集合、三集合情形

二集合

\[|A \cup B| = |A| + |B| - |A \cap B| \]

三集合

\[|A \cup B \cup C| = |A|+|B|+|C| - |A \cap B| - |A \cap C| - |B \cap C| + |A \cap B \cap C| \]

子集枚举实现

竞赛中常用位运算枚举子集实现容斥:

// 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! - \binom{n}{1}(n-1)! + \binom{n}{2}(n-2)! - \cdots + (-1)^n\binom{n}{n}0! \]

\[\boxed{D_n = n!\sum_{k=0}^{n}\frac{(-1)^k}{k!}} \]

递推:\(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\) 整除的数:

\[\boxed{\varphi(n) = n\prod_{i=1}^{k}\left(1 - \frac{1}{p_i}\right)} \]

应用 3:不定方程上下界(见第 8.4 节)

应用 4:第二类 Stirling 数(容斥公式)

\(n\)不同元素划分为恰好 \(k\)非空集合的方案数 \(S(n,k)\)

\[\boxed{S(n, k) = \frac{1}{k!}\sum_{i=0}^{k}(-1)^i\binom{k}{i}(k-i)^n} \]

应用 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 润色

posted @ 2026-09-02 09:13  lvwangshu  阅读(38)  评论(0)    收藏  举报