排列组合

1. 组合恒等式

1.1 范德蒙德卷积

\[\sum\limits_{a+b=k}\binom{n}{a}\binom{m}{b}=\binom{n+m}{k} \]

它的组合意义为:有两堆球,分别有 \(n\)\(m\) 个,现在从两堆球中一共取出 \(k\) 个球的方案数。

2. 隔板法

2.1 不定方程计数

Problem 1(正整数解):有 \(k\) 个变量 \(x_1,x_2,\dots,x_k\),若 \(\sum\limits_{i=1}^k x_i=r\)\(x_i\gt 0\),求有多少组解。

隔板法,相当于将排成一排的 \(r\) 个球分成 \(k\) 分,也就是在 \(r-1\) 个空隙中插入 \(k-1\) 个隔板,两头和相邻隔板中间的球数就是 \(x_i\)

所以解的数量为 \(\binom{r-1}{k-1}\)

Problem 2(非负整数解):将 Problem 1 中的限制 \(x_i\gt 0\) 改为 \(x_i\ge 0\),其余不变。

换元法:令 \(x^{'}_i=x_i+1\),则限制等价于 \(\sum\limits_{i=1}^k x^{'}_i=r+k\)\(x^{'}_i\gt 0\)

这就变成了 Problem 1,插板法得解数为

\[\binom{r+k-1}{k-1} \]

转换法:枚举有多少个 \(x_i\)\(\gt 0\) 的,转化为 \(i\) 阶的正数解(Problem 1)问题。

\[\sum\limits_{i=1}^k\binom{k}{i}\binom{r-1}{i-1} =\binom{r+k-1}{k-1} \]

证明:因为 \(\binom{r-1}{i-1}=\binom{r-1}{r-i}\),所以

\[\sum\limits_{i=1}^k\binom{k}{i}\binom{r-1}{i-1}= \sum\limits_{i=1}^k\binom{k}{i}\binom{r-1}{r-i} \]

转化之后就是一个范德蒙德卷积的形式,考虑组合意义,就是有两堆球,分别有 \(k\)\(r-1\) 个,求从两堆球中选出一共 \(r\) 个球的方案数。

而这个方案数显然也等于 \(\binom{r+k-1}{r}=\binom{r+k-1}{k-1}\),所以原式成立,证毕。

Problem 3(规定下界):将 Problem 1 中的限制 \(x_i\gt 0\) 改为 \(x_i\ge a_i\)(其中 \(a_i\ge 0\)\(\sum a_i\le n\)),其余不变。

仍然用 Problem 2 中的换元法,令 \(x^{'}_i=x_i-a_i\),则限制等价于 \(\sum\limits_{i=1}^k x^{'}_i=r-\sum a_i\)\(x^{'}_i\ge 0\)

由 Problem 2 知解数为

\[\binom{r-\sum a_i+k-1}{k-1} \]

Problem 4(上界):将 Problem 1 中的限制 \(x_i\gt 0\) 改为 \(x_i\le a_i\),其余不变。

观察到算某个 \(x_i\) 超限是比较容易的,所以考虑容斥。

设集合 \(S_i\) 表示 “所有 \(x_i\) 超限的解集”,其中 “超限” 是指 \(x_i\gt a_i\)

则我们要求的是

\[\left|\bigcap\limits_{i=1}^k\overline{S_i}\right| \]

根据容斥原理,它等于

\[\left|U\right|-\sum\limits_{i}\left|S_i\right|+\sum\limits_{i\lt j}\left|S_i\cap S_j\right|-\sum\limits_{i\lt j\lt k}\left|S_i\cap S_j\cap S_k\right|+\dots \]

首先 \(\left|S_i\right|\) 很好算,直接给 \(x_i\) 预先分配 \(a_i+1\) 即可。因此 \(\left|S_i\right|=\binom{r-a_i-1+k-1}{k-1}\)

再考虑算 \(\left|S_i\cap S_j\right|\),相当于给 \(x_i\)\(x_j\) 分别提前分配 \(a_i+1\)\(a_j+1\),三个以上的集合并同理。

归纳一下,就是对于下标集合为 \(\{p_i\}\)\(S_{p_i}\) 的并集大小为

\[\left|\bigcap\limits_i S_{p_i}\right|=\binom{r-\sum\limits_i (a_{p_i}+1)+k-1}{k-1} \]

最后算一下 \(\left|U\right|\),直接隔板法 \(\left|U\right|=\binom{r+k-1}{k-1}\)

带入容斥的式子,就可以得到最终答案为

\[\binom{r+k-1}{k-1}+\sum\limits_{i=1}^n(-1)^i\sum\limits_{|p|=i}\binom{r-\sum\limits_k (a_{p_k}+1)+k-1}{k-1} \]

3. 多重集合

多重集,集合中一种元素的个数可以 \(\gt 1\),也就是 \(\texttt{std::multiset}\)

3.1 多重集组合数

下面假设多重集 \(S\) 中有 \(k\) 种元素,分别为 \(a_1,a_2,\dots,a_k\)。每种元素的个数分别为 \(x_1,x_2,\dots,x_k\)。我们用以下方式表示 \(S\)

\[S=\{x_1\cdot a_1,x_2\cdot a_2,\dots,x_k\cdot a_k\} \]

多重集 \(S\)\(r\) 组合,是指从多重集 \(S\) 中选出的大小为 \(r\) 的子集。

无限多重集的 \(r\) 组合数:多重集 \(S\) 中任意一种元素的个数都为 \(+\infty\)(或 \(\ge r\),两者等价),求 \(S\)\(r\) 组合有多少个。

\[S=\{\infty\cdot a_1,\infty\cdot a_2,\dots\infty\cdot a_k\} \]

我们设 \(S\) 的一个 \(r\) 组合为

\[T=\{x_1\cdot a_1,x_2\cdot a_2,\dots,x_k\cdot a_k\} \]

则有如下的限制:\(\sum\limits_{i=1}^k x_i=r\),且 \(x_i\ge 0\)。这是不定方程计数问题,其解数为 \(\binom{r+k-1}{k-1}\),所以多重集 \(S\)\(r\) 组合数即为 \(\binom{r+k-1}{k-1}\)

4. 容斥与反演

4.1 基本容斥原理

形式一

形式二

4.2 子集反演

4.2.1 容斥视角

设函数 \(f,g\) 满足

\[f(S)=\sum\limits_{T\subseteq S}g(T) \]

子集反演,就是用 \(f\) 的值反解出 \(g\) 的过程。

假设我们要反解 \(g(S)\),考虑容斥

  • 加入 \(f(S)\)
  • 减去 \(f(S\setminus a_i)\)
  • 加上 \(f(S\setminus a_i\setminus a_j)\)
  • \(\dots\)

最后算出来的就是 \(g(S)\)

接下来就有两个问题:为什么这是容斥呢?为什么算出来是对的呢?

首先,我们考虑最经典的容斥,也就是计算集合大小。设 \(V_i\) 表示“所有不包含 \(a_i\) 的子集”的集合,也就是 \(\{T\mid T\subset S ~且~ a_i\notin T\}\),如果我们要计算 \(\left|S\right|\)
那么会用到如下公式。(\(U=\bigcup\limits_i V_i\)

\[\left|S\right|=\left|U\right|-\sum\limits_{i}\left|V_i\right|+\sum\limits_{i\lt j}\left|V_i\cap V_j\right|-\dots \]

这里的 \(\left|V_i\right|\) 就类似于 \(f(S\setminus a_i)\),都是对集合所有子集的求和。只不过前者是对大小求和,后者是对 \(g\) 求和。
同样地,\(\left|V_i\cap V_j\right|\)\(f(S\setminus a_i\setminus a_j)\) 也是有相似的意义。

那么我们将 \(V\) 替换为 \(f\),同样可以达到容斥的效果(使除了 \(S\) 之外的集合都计算 \(0\) 次,\(S\) 计算一次)

从而有

\[g(S)=f(S)-\sum\limits_{i}f(S\setminus a_i)+\sum\limits_{i\lt j}f(S\setminus a_i\setminus a_j)-\dots \]

写成更简单的形式

\[g(S)=\sum\limits_{T\subseteq S}(-1)^{\left|S\right|-\left|T\right|}f(T) \]

这就是子集反演的第一种形式

\[f(S)=\sum\limits_{T\subseteq S}g(T) \\ \Rightarrow g(S)=\sum\limits_{T\subseteq S}(-1)^{\left|S\right|-\left|T\right|}f(T) \]

当然还有另外一种

\[f(T)=\sum\limits_{T\subseteq S}g(S) \\ \Rightarrow g(T)=\sum\limits_{T\subseteq S}(-1)^{\left|S\right|-\left|T\right|}f(S) \]

4.2.2 高维求和视角(正确性?)

我们将 \((a_1,a_2,\dots, a_k)\) 看作 \(k\) 维向量,然后我们重新审视最初的这个式子

\[f(S)=\sum\limits_{T\subseteq S}g(T) \]

不难发现是高维前缀和的形式,高维前缀和可以按维度进行前缀和。

反演即高维差分。

4.3 二项式反演

若函数 \(f,g\) 满足

\[f(n)=\sum\limits_{m\le n}\binom{n}{m}g(m) \]

\[g(n)=\sum\limits_{m\le n}(-1)^{n-m}\binom{n}{m}f(m) \]

二项式反演完全可以看成子集反演的一种特殊情况。

设全集 \(U\) 是可重集,其中包含 \(n\) 个相同元素 \(a\)。这里因为所有元素都是相同的,所以我们不妨做一个简化:用 \(n\) 代表所有大小为 \(n\) 的集合。

那么 \(f(n)=\sum\limits_{m\le n}\binom{n}{m}g(m)\) 就相当于是子集反演中的 \(f(S)=\sum\limits_{T\subseteq S}g(T)\)。其中二项式反演多出来的组合数是因为大小为 \(n\) 的集合有 \(\binom{n}{m}\) 个大小为 \(m\) 的子集。

二项式反演的另一种形式

\[f(m)=\sum\limits_{m\le n}\binom{n}{m}g(n) \\ \Rightarrow g(m)=\sum\limits_{m\le n}(-1)^{n-m}\binom{n}{m}f(n) \]

4.4 莫比乌斯反演

莫比乌斯反演是一种较为复杂的反演。

如果函数 \(f,g\) 满足

\[f(x)=\sum\limits_{d\mid x}g(d) \]

\[g(x)=\sum\limits_{d\mid x}\mu(\frac{x}{d})f(d) \]

其中 \(\mu(x)\) 就是莫比乌斯函数,它的定义如下

\[\mu(x)= \begin{cases} 1 && {x=1} \\ 0 && {x含平方因子} \\ (-1)^k && {x不含平方因子,其中k为x的质因数个数} \end{cases} \]

那么如何理解/证明莫比乌斯反演呢?

首先,我们可以将任意的非负整数进行质因数分解,比如 \(x=p_1^{c_1}p_2^{c_2}\dots p_k^{c_k}\)
然后我们就可以将 \(x\) 看作一个多重集合 \(\{c_1\cdot p_1,c_2\cdot p_2,\dots,c_k\cdot p_k\}\)

那么

\[f(x)=\sum\limits_{d\mid x}g(d) \]

就非常类似于子集求和,\(d\mid x\) 就表示 \(d\)\(x\) 的子集。

但是这里的子集求和与之前”二项式反演“那里的子集求和略有区别:此处的相同元素是没有编号的,两个集合不同当且仅当集合中的元素不完全相同。

我们仍然考虑容斥算 \(g(x)\),设 \(S_i\) 表示 \(x/p_i\) 所有子集构成的集合,则我们要的 \(x\) 对应的集合是 \(\bigcap\limits_{i=1}^k \overline{S_i}\)

由容斥原理:

  • 加入 \(U\),也就是 \(f(x)\)
  • 减去 \(\sum\limits_i S_i\),也就是 \(f(\frac{x}{p_i})\)
  • 加上 \(\sum\limits_{i\lt j} S_i\cap S_j\),也就是 \(f(\frac{x}{p_ip_j})\)
  • \(\dots\)

也就是

\[g(x)=f(x)-\sum\limits_{i}f(\frac{x}{p_i})+\sum\limits_{i\lt j}f(\frac{x}{p_ip_j})-\dots \]

注意到这里是不含 \(\frac{x}{p_i^2p_j}\) 这种带平方因子的东西的,所以可以写成如下形式(其中 \(\left|d\right|\) 表示 \(d\) 的质因数数量)

\[g(x)=\sum\limits_{d\mid x 且 d不含平方因子}(-1)^{\left|d\right|}f(\frac{x}{d})\\ \]

如果我们引入 \(\mu(d)\),也就等价于

\[\begin{align} g(x)=\sum\limits_{d\mid x}\mu(d)f(\frac{x}{d})\\ \Leftrightarrow g(x)=\sum\limits_{d\mid x}\mu(\frac{x}{d})f(d) \end{align} \]

posted @ 2026-09-16 20:33  hzy1  阅读(12)  评论(0)    收藏  举报