组合数学(容斥与反演)

前言

校测被数学干碎了,赶紧来补一点容斥和反演的东西,能补多少算多少吧。

特别说明:这一篇学习笔记是组合数学的第二篇。

反演

这是一个听着很高大上,实际不简单(因为wtcl)的东西。

反演的实质

对于形如下面的式子,我们称左右两式互为反演式:

\[f_i=\sum^{i}_{j=1}A_{i,j}g_j\Leftrightarrow g_i=\sum_{j=1}^iB_{i,j}f_j \]

然后 \(f\)\(g\) 可以看成只有一行的矩阵(也就是向量),这个式子就可以看成矩阵乘法求逆(解向量)。

子集反演

首先我们需要知道子集反演解决什么样的问题:在恰好是某个集合至少/至多是此集合之间转换。

如果我们求一个特定的符合要求的集合 \(A\),设 \(f(S)\) 表示 \(A=S\) 的答案,\(g(S)\) 表示 \(S\subseteq A\) 的答案,我们钦定选择了 \(T\subseteq S\),就有 \(g(S)=\sum_{T\subseteq S}f(T)\),反演得到:\(f(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}g(T)\)

证明:将两个式子代一下即可,在此不给出详细证明,后面二项式反演会证,可以参考其证法。

例题咕咕咕。

二项式反演

二项式反演是最常见的反演之一,下面给出两种形式并证明第一种。

形式一

\[f(n)=\sum^{n}_{i=m}{n\choose i}g(i)\Leftrightarrow g(n)=\sum^{n}_{i=m}(-1)^{n-i}{n\choose i}f(i) \]

形式二

\[f(n)=\sum^{n}_{i=m}{i\choose m}g(i)\Leftrightarrow g(n)=\sum^{n}_{i=m}(-1)^{i-m}{i\choose m}f(i) \]

形式一证明:

\[\begin{aligned} f(n)&=\sum^{n}_{i=m}{n\choose i}g(i)\\ &=\sum^{n}_{i=m}{n\choose i}\sum^{i}_{j=m}(-1)^{i-j}{i\choose j}f(j)\\ &=\sum^{n}_{j=m}f(j)\sum^{n}_{i=j}{n\choose i}{i\choose j}(-1)^{i-j}\\ &=\sum^{n}_{j=m}f(j)\sum^{n}_{i=j}{n\choose j}{n-j\choose i-j}(-1)^{i-j}\\ &=\sum^{n}_{j=m}f(j){n\choose j}\sum^{n}_{i=j}{n-j\choose i-j}(-1)^{i-j}\\ &=\sum^{n}_{j=m}f(j){n\choose j}\sum^{n-j}_{i=0}{n-j\choose i}(-1)^{i}\\ &=\sum^{n}_{j=m}f(j){n\choose j}[n=j]\\ &=f(n) \end{aligned} \]

形式二类似。

常见形式

对于求恰好若干个元素满足条件的题目,若不能直接求,可以考虑先转化成钦定有若干个元素满足条件再套上二项式反演。

例题

BZOJ2839 集合计数

简要题意

一个有 \(N\) 个元素的集合有 \(2N\) 个不同子集(包含空集),现在要在这 \(2N\) 个集合中取出若干集合(至少一个),使得它们的交集的元素个数为 \(K\),求取法的方案数,答案模 \(10^9+7\)

数据范围:\(1\le K\le N\le10^6\)

题解

我们设 \(f(i)\) 表示选出子集大小恰好为 \(i\) 的方案数,然而我们发现这个东西不好转移。但是,如果我们先求出一个限制条件少一点但是比较好求的东西 \(g(i)\) 再去求 \(f(i)\) 就会简单许多(也许。

于是就有 \(g(i)\) 表示钦定 \(i\) 个元素在交集中(其他元素不考虑),这样 \(g(i)\) 就比较好求了,我们可以把 \(g(i)\) 的式子写出来:\(g(i)={n\choose i}(2^{2^{n-i}}-1)\)。为什么呢?首先我们需要从 \(n\) 个元素中选择 \(i\) 个元素,所以有 \(n\choose i\),然后对于剩下 \(n-i\) 个元素,我们可以列举出可能存在的集合的可能,也就是 \(2^{n-i}\) 种可能,对于这些集合我们可以选可以不选,但是题目要求至少选一个,所以就是一个 \(2^{n-i}\) 元集去掉空集,然后选的元素与不选的元素之间互有影响所以是乘法原理。

然后就是去找 \(f\)\(g\) 的关系了。其实对于 \(g\),我们还有另一种求法:\(g(i)=\sum^n_{j=i}{j\choose i}f(j)\)。其实就是对于选出子集大小恰为 \(j\) 的方案中再去选出 \(i\) 个,与第一种方法等价。

然后看到后面这坨直接二项式反演就可以得到:

\[f(i)=\sum^n_{j=i}(-1)^{j-i}{j\choose i}{n\choose j}(2^{2^{n-j}}-1) \]

然后直接算就行。

P4859 已经没有什么好害怕的了

简要题意

有两个序列 \({a_i},{b_i}\) 保证所有元素互不相同。你需要重排 \(b\) 序列,使得恰好有 \(k\)\(i\) 满足 \(a_i>b_i\)

\(0<k\leq n\leq2000\)

题解

因为每一个 \(a,b\) 关系都是相对独立的,所以可以先对 \(A=\{a_i\}\) 排序。

然后就能想到一个 \(dp_{i,j}\) 表示考虑前 \(i\) 对,恰好有 \(j\) 对满足条件,设 \(f_i\) 表示所有数中恰有 \(i\) 对的方案,所以 \(f_i=(n-i)!dp_{n,i}\),且 \(f_k\) 即为最后答案。然后就做完了!

但是这个东西似乎无法直接转移((,所以我们需要换一下思路,那么不妨放宽条件,我们重新定义一个 \(dp_{i,j}\) 表示钦定 \(j\) 对满足条件,设 \(g_i\) 表示所有数中钦定有 \(i\) 对的方案,然后稍加讨论就能转移了:

\[dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}\times(cnt(a_i)-j+1) \]

其中 \(cnt(a_i)\) 表示 \(B=\{b_i\}\) 中比 \(a_i\) 小的数的个数,这个似乎可以直接维护。

然后我们可以找找 \(f\)\(g\) 的关系(这不就是二项式反演的组合意义吗),然后因为:

\[(n-i)!dp_{n,i}=g(i)=\sum\limits_{j=i}^n\dbinom ji f(j) \]

根据二项式反演有:

\[f(k)=\sum\limits_{i=k} ^n{(-1)^{n-i}\dbinom ik(n-i)!dp_{n,i}} \]

莫比乌斯反演

对于一些函数,我们无法快速求出其值,但可以快速求出其倍数或约数的值,我们就能通过莫比乌斯反演快速求值。

积性函数

定义:若一个数论函数 \(f(n)\) 满足 \(f(pq)=f(p)\times f(q),\gcd(p,q)=1\),则称 \(f(n)\) 是一个积性函数。如果 \(\gcd(p,q)=k,k\in Z\),仍能满足上式则称 \(f(n)\) 为完全积性函数。

性质:若 \(f(n)\)\(g(n)\) 均为积性函数,则下面函数均为积性函数:

  1. \(h(x)=f(x^p)\)
  2. \(h(x)=f^p(x)\)
  3. \(h(x)=f(x)g(x)\)
  4. \(h(x)=\sum_{d|x}f(d)g(\frac{x}{d})\)

常见积性函数

  • 单位函数 \(\epsilon(n)=[n=1]\)
  • 常数函数 \(1(n)=1\)
  • 幂函数 \(id_k(n)=n^k\),其中 \(id_1(n)\) 简记为 \(id(n)\)
  • 因数个数函数 \(d(n)=\sum_{d|n}1\)
  • 除数函数 \(\sigma_k(n)=\sum_{d|n}d^k\),其中 \(k=0\) 时就是因数个数函数,\(k=1\) 时为因数和函数,简记为 \(\sigma(n)\)
  • 欧拉函数 \(\varphi(n)=\sum^n_{i=1}[\gcd(i,n)=1]\)
  • 莫比乌斯函数 $$\mu(n)=\begin{cases}1&n=1\0&n \text{含有平方因子}\(-1)^k& k \text{为} n \text{本质不同的质因子个数}\end{cases}$$

狄利克雷卷积

\[(f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d}) \]

性质

  • 交换律:\(f*g=g*f\)
  • 结合律:\((f*g)*h=f*(g*h)\)
  • 分配律:\((f+g)*h=f*h+g*h\)
  • 如果 \(f,g\) 是积性函数,则 \(f*g\) 也是积性函数。

有了这些性质,我们将前面的某些积性函数卷一卷就可以发现一些有趣的事实。

比较重要的卷积

\(id*1=\sigma\)

\(id\)\(1\) 卷起来就是求因数和,根据狄利克雷卷积的式子结合函数的意义可以理解。

\(1*1=d\)

与上一个式子相似,不过多赘述。

\(\varphi*1=id\)

证明:

\(n=p_1^{c_1}p_2^{c_2}\dots p_k^{c_k}\),因为 \(\varphi\) 是积性函数,则只用证 \(p^c\) 时成立即可。

\[\begin{aligned} \varphi*1&=\sum_{d|n}\varphi(\frac{n}{d})\\ &=\sum_{i=0}^c\varphi(p^i)\\ &=1+(p-1)+p\times(p-1)+\dots+p^{c-1}\times(p-1)\\ &=1+p-1+p^2-p+\dots+p^c-p^{c-1}\\ &=p^c\\ &=id \end{aligned} \]

应用-欧拉反演:\(n=\sum_{d|n}\varphi(d)\)

\(\mu*1=\epsilon\)

证明:当 \(n=1\) 时显然成立,当 \(n>1\) 时,\(n=p_1^{c_1}p_2^{c_2}\dots p_k^{c_k}\)。当我们卷积枚举因数时,对于枚举到的数的质因数 \(\exists c_i>1\),那么这一项对答案没有贡献,于是我们只用考虑 \(\forall c_i=1\) 的情况。

\[\begin{aligned} \mu*1&=\sum_{d|n}\mu(d)\\ &=\mu(1)+\mu(p_1)+\mu(p_2)+\dots+\mu(p_k)+\mu(p_1p_2)+\mu(p_1p_3)+\dots+\mu(p_1p_2\dots p_k)\\ &=\sum^k_{i=0}(-1)^i{k\choose i}\\ &=0 \end{aligned} \]

应用-莫比乌斯反演:\([n=1]=\sum_{d|n}\mu(d)\)

莫比乌斯反演的另一种形式(经典形式):\(f*1=g\leftrightarrow g*\mu=f\)

以上就是最基本的卷积,需要无条件记住!接下来我们根据上面的一些东西可以口胡推出另一些式子。

\(f*\epsilon=f\)

\(\varphi*d=\varphi*1*1=id*1=\sigma\)

\(\mu*id=\mu*1*\varphi=\epsilon*\varphi=\varphi\)

\(\mu*\sigma=\mu*1*id=\epsilon*id=id\)

例题

前言:写了这么多前置知识,终于可以开始最有趣的推式子环节了!

注:以下均默认 \(n\le m\)

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=1]&=\sum_{i=1}^n\sum_{j=1}^m\sum_{d|\gcd(i,j)}\mu(d)\\ &=\sum_{d=1}^n\mu(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}1\\ &=\sum_{d=1}^n\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor \end{aligned} \]

其中 \(\mu\) 可以预处理,\(\lfloor\frac{n}{d}\rfloor\) 可以 \(O(\sqrt n)\) 数论分块。

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)&=\sum_{i=1}^n\sum_{j=1}^m\sum_{d|\gcd(i,j)}\varphi(d)\\ &=\sum_{d=1}^n\varphi(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}1\\ &=\sum_{d=1}^n\varphi(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor \end{aligned} \]

\(\varphi\)\(\mu\) 一样可以预处理,然后就做完了。

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^mf(\gcd(i,j))&=\sum_{d=1}^nf(d)\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=d]\\ &=\sum_{d=1}^nf(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1]\\ &=\sum_{d=1}^nf(d)\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\lfloor\frac{n}{dk}\rfloor\lfloor\frac{m}{dk}\rfloor\\ \end{aligned} \]

\(dk=T\),则:

\[\begin{aligned} &=\sum_{T=1}^n\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum_{d|T}\mu(d)f(\frac{T}{d}) \end{aligned} \]

后面那坨可以 \(O(n)\) 预处理。

参考资料

子集反演学习笔记

部分经典反演的推导附矩阵形式

『组合数学总结1:基础组合数学和组合原理』

posted @ 2024-10-15 17:51  Nekopedia  阅读(17)  评论(0编辑  收藏  举报