排列组合
1. 组合恒等式
1.1 范德蒙德卷积
它的组合意义为:有两堆球,分别有 \(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,插板法得解数为
转换法:枚举有多少个 \(x_i\) 是 \(\gt 0\) 的,转化为 \(i\) 阶的正数解(Problem 1)问题。
证明:因为 \(\binom{r-1}{i-1}=\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 知解数为
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|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|U\right|\),直接隔板法 \(\left|U\right|=\binom{r+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\) 的 \(r\) 组合,是指从多重集 \(S\) 中选出的大小为 \(r\) 的子集。
无限多重集的 \(r\) 组合数:多重集 \(S\) 中任意一种元素的个数都为 \(+\infty\)(或 \(\ge r\),两者等价),求 \(S\) 的 \(r\) 组合有多少个。
我们设 \(S\) 的一个 \(r\) 组合为
则有如下的限制:\(\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\) 的值反解出 \(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|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\) 计算一次)
从而有
写成更简单的形式
这就是子集反演的第一种形式
当然还有另外一种
4.2.2 高维求和视角(正确性?)
我们将 \((a_1,a_2,\dots, a_k)\) 看作 \(k\) 维向量,然后我们重新审视最初的这个式子
不难发现是高维前缀和的形式,高维前缀和可以按维度进行前缀和。
反演即高维差分。
4.3 二项式反演
若函数 \(f,g\) 满足
则
二项式反演完全可以看成子集反演的一种特殊情况。
设全集 \(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\) 的子集。
二项式反演的另一种形式
4.4 莫比乌斯反演
莫比乌斯反演是一种较为复杂的反演。
如果函数 \(f,g\) 满足
则
其中 \(\mu(x)\) 就是莫比乌斯函数,它的定义如下
那么如何理解/证明莫比乌斯反演呢?
首先,我们可以将任意的非负整数进行质因数分解,比如 \(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\}\)
那么
就非常类似于子集求和,\(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\)
也就是
注意到这里是不含 \(\frac{x}{p_i^2p_j}\) 这种带平方因子的东西的,所以可以写成如下形式(其中 \(\left|d\right|\) 表示 \(d\) 的质因数数量)
如果我们引入 \(\mu(d)\),也就等价于
浙公网安备 33010602011771号