Min-Max 容斥

1 引入

Min-Max 容斥,又称最值反演,是一种用于特定集合在已知最大值或最小值的情况下求另一者的算法。

举个例子来讲,我们不难注意到以下式子:

\[\max(a,b)=a+b-\min(a,b) \]

这就是 Min-Max 容斥的二元基本形式。容易发现,只要我们对所有数取相反数,那么用最小值求最大值和用最大值求最小值的算法本质上相同。下文只讨论用最小值求最大值的方法。

2 基本形式

\(\max(S)\) 表示集合 \(S\) 中的最大值,\(\min(S)\) 表示集合 \(S\) 中的最小值,则有:

\[\max(S)=\sum_{T\sub S,T\neq \varnothing} (-1)^{|T|-1} \min(T) \]

证明:与二项式反演类似的,我们定义一个函数 \(f(i)\) 表示一个关于集合大小 \(i\) 的函数,且满足 \(\max(S)=\sum\limits_{T\subset S,T\neq \varnothing} f(|T|) \min(T)\)。接下来我们对 \(S\) 中的元素从大到小排序为 \(x_1,x_2,\cdots,x_n\),则对于 \(x_i\), 其在等式左边的贡献为 \([i=1]\),在右边的贡献为 \(\sum\limits_{j=0}^{i-1} \binom{i-1}{j} f(j+1)\)。若等式成立,则有:

\[[i=1]=\sum\limits_{j=0}^{i-1} \binom{i-1}{j} f(j+1) \]

即:

\[[i+1=1]=\sum\limits_{j=0}^{i} \binom{i}{j} f(j+1) \]

那么设 \(F(i)=[i+1=1],G(i)=f(i+1)\),则会有:

\[F(i)=\sum_{j=0}^i \binom ij G(j) \]

对这个式子进行二项式反演可得:

\[G(i)=\sum_{j=0}^i (-1)^{i-j}\binom ij F(j)=(-1)^i \]

所以 \(f(i)=G(i-1)=(-1)^{i-1}\),所以原式成立。

3 推广形式

\(k\max(S)=\) 表示集合 \(S\) 的第 \(k\) 大值,则有:

\[k\max(S)=\sum_{T\sub S,|T|\ge k} (-1)^{|T|-k} \binom{|T|-1}{k-1}\min(T) \]

证明:依然设一个函数 \(g(i)\) 表示一个关于集合大小 \(i\) 的函数,且满足 \(k\max(S)=\sum\limits_{T\subset S,T\neq \varnothing} g(|T|) \min(T)\),并且对 \(S\) 中元素从大到小排序。那么对于 \(x_i\),其对等式左边的贡献为 \([i=k]\),对右边的贡献为 \(\sum\limits_{j=0}^{i-1} \binom{i-1}{j} g(j+1)\)。若等式成立,则有:

\[[i=k]=\sum\limits_{j=0}^{i-1} \binom{i-1}{j} g(j+1) \]

同样的,设 \(F(i)=[i+1=k],G(i)=g(i+1)\),那么有:

\[F(i)=\sum_{j=0}^i \binom ij G(j) \]

根据二项式反演可得:

\[G(i)=\sum_{j=0}^i (-1)^{i-j}\binom ij F(j)=(-1)^{i-k+1}\binom{i}{k-1} \]

\(g(i)=G(i-1)=(-1)^{i-k}\binom{i-1}{k-1}\),所以原式成立。

4 应用

4.1 应用场景

你可能会觉得这东西很弱智,毕竟最大最小值都可以直接求,不必这么麻烦。事实上,它真正有用的场景是在期望中,因为 Min-Max 容斥在期望中也是成立的:

\[\begin{aligned} E(\max(S)) =\sum_{T\sub S,T\neq \varnothing} (-1)^{|T|-1} E(\min(T))\\ E(k\max(S))=\sum_{T\sub S,|T|\ge k} (-1)^{|T|-k}E(\min(T)) \end{aligned} \]

这就给了我们非常大的操作空间去求出最大值甚至 \(k\) 大值的期望。

另一方面来讲,我们知道,\(\text{lcm}\) 是对所有数字的质因子指数取 \(\max\),而 \(\gcd\) 是对所有数字的质因子指数取 \(\min\),于是我们对指数做一个 Min-Max 容斥即可得到:

\[\text{lcm}(S)=\prod_{T\sub S,T\neq \varnothing} \gcd(T)^{(-1)^{|T|-1}} \]

这也是 Min-Max 容斥的应用之一。

4.2 例题

下面的两道例题正好运用了上面所说的两个应用。

例 1 [HAOI2015] 按位或

\(\text{Link}\)

容易发现,假如我们令 \(t_i\) 表示第 \(i\) 位变为 \(1\) 的时间,那么答案就是 \(E(\max t_i)\)。根据 Min-Max 容斥有:

\[E(\max t_i)=\sum (-1)^{|T|-1} E(\min t_i) \]

所以我们枚举出位的集合 \(T\),问题就在于求出这些位当中第一次出现 \(1\) 的期望时间。考虑去求出这些位中出现 \(1\) 的概率 \(p\),实际上就是 \(1\) 减去这些位上不出现 \(1\) 的概率。要让这些位上不出现 \(1\),只能说明我们选的是 \(T\) 的补集的子集,我们只需要求出选出这些子集的概率之和即可。

求子集的概率之和就很简单了,直接做一遍高维前缀和即可得出答案,最后算出对应的 \(p\),那么 \(E(\min t_i)\) 就等于 \(\tfrac 1p\)。最后根据这个算出 \(E(\max t_i)\) 即可。

例 2 [BZOJ4833] 最小公倍佩尔数

\(\text{Link}\)

下文中为了方便,记原来的 \(f(n)\)\(F_n\)\(e(n)\)\(E_n\)

首先 \(F_n\) 的通项公式其实是可以求出来的,不过没有什么用,对做出此题没有帮助。不妨换一种思路,根据题意推一下 \(F_n\) 的递推式。首先显然有如下式子:

\[\begin{aligned} (1+\sqrt 2)^n &=(1+\sqrt2)(1+\sqrt2) ^{n-1}\\ &=(1+\sqrt 2)(E_{n-1}+\sqrt2 F_{n-1})\\ &=E_{n-1}+\sqrt2 F_{n-1}+\sqrt2 E_{n-1}+2F_{n-1} \end{aligned} \]

于是可以得到:

\[\begin{aligned} E_n=E_{n-1}+2F_{n-1}\\ F_n=F_{n-1}+E_{n-1} \end{aligned} \]

由下面的式子可以得到 \(E_{n-1}=F_n-F_{n-1}\),带入上面的式子可以得到 \(E_n=F_n+F_{n-1}\),再带回下面的式子可得:

\[F_n=2F_{n-1}+F_{n-2} \]

这就是 \(F_n\) 的递推公式。接下来我们有一个性质,如果一个数列的递推公式为 \(F_n=aF_{n-1}+bF_{n-2}\)\(\gcd(a,b)=1\),那么 \(\gcd(F_n,F_m)=F_{\gcd(n,m)}\)。于是我们就可以将 \(\gcd\) 转到下标上,方便操作。

不过题目中给出的要求是求 \(\text{lcm}\),而我们现在求出的是 \(\gcd\),于是不难想到 Min-Max 容斥的操作:

\[\text{lcm}(S)=\prod_{T\sub S,T\neq \varnothing} \gcd(T)^{(-1)^{|T|-1}} \]

在此题中它表示为:

\[g(n)=\prod_{T\sub S,T\neq \varnothing} f_{\gcd(T)}^{(-1)^{|T|-1}} \]

其中 \(S\) 表示 \(1\sim n\) 的所有整数构成的集合。现在下标上有 \(\gcd\),非常不好看,我们考虑直接枚举 \(\gcd(T)\)

\[g(n)=\prod_{T\sub S,T\neq \varnothing}\prod_{i=1}^n f_{i}^{(-1)^{|T|-1}} [\gcd(T)=i] \]

接下来将所有东西挪到 \(f_i\) 的指数上:

\[g(n)=\prod_{i=1}^n f_{i}^{\sum_{T\sub S,T\neq \varnothing}[\gcd(T)=i](-1)^{|T|-1}} \]

现在的问题就是求 \(\sum\limits_{T\subset S,T\neq \varnothing}[\gcd(T)=i](-1)^{|T|-1}\),这是一个经典的 \(\gcd\) 容斥,令 \(f(i)=\sum\limits_{T\subset S,T\neq \varnothing}[\gcd(T)=i](-1)^{|T|-1}\)\(h(i)=\sum\limits_{T\subset S,T\neq \varnothing}[i\mid \gcd(T)](-1)^{|T|-1}\),则根据莫比乌斯反演可得:

\[h(i)=\sum_{i\mid d} f(d)\iff f(i)=\sum_{i\mid d} h(d)\mu (\dfrac di) \]

然后回来看 \(h(i)\) 的取值,我们求出 \(n\) 范围内 \(i\) 的所有倍数,那么我们可以在这里面任意选择出集合 \(T\)。理论上讲由于 \(T\) 的大小是奇数还是偶数的情况数是一致的,所以所有的 \((-1)^{|T|-1}\) 会抵消掉。但是由于 \(T\neq\varnothing\),所以偶数的情况会少一种,所以会剩下一个奇数情况没有消掉,于是 \(h(i)=[i\le n]\)

所以可以得到 \(f(i)=\sum\limits_{i\mid d}\mu(\tfrac di)\),改枚举 \(d\)\(\tfrac di\) 可得:

\[f(i)=\sum_{j=1}^{\lfloor\tfrac ni\rfloor} \mu(j) \]

带回原式可得:

\[g(n)=\prod_{i=1}^n f_i^{\sum_{j=1}^{\lfloor\frac ni\rfloor}\mu(j)} \]

暴力求的话肯定不行。考虑到对于一个 \(f_i\),它给 \(g(i)\sim g(n)\) 做贡献时,上面的指数 \(\sum_{j=1}^{\lfloor\tfrac ni\rfloor} \mu(j)\) 最多只会改变 \(\lfloor\tfrac ni\rfloor\) 次,所以我们只需要在它做出的贡献改变的时候乘上新的贡献,最后再做一次前缀积即可得出正确的 \(g(n)\)。总复杂度 \(O(n\ln n)\),可以通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874654.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式键值存储的王者--ETCD

在分布式系统的世界里,数据的一致性、可用性和分区容错性如同三座大山,横亘在开发者面前。 而 ETCD,犹如一位技艺高超的登山者,以其卓越的性能和稳定的表现,征服了这三座高峰,成为分布式键值存储领域当之无愧的王者。 ETCD 不仅仅是一个简单的键值存储系统,它更是分布式…

如何在CMS中修改网站的安装位置

问题描述:如何在CMS中修改网站的安装位置。 解决方法:确定CMS类型:不同的CMS可能有不同的方法来修改网站的安装位置。首先需要确定您使用的是哪种CMS,例如WordPress、Drupal、Joomla等。 备份网站数据:在进行任何修改之前,务必备份网站的所有数据,包括数据库和文件。这是…

WebStorm2024如何安装?附安装包和激活方式

前言 大家好,我是小徐啊。WebStorm是我们常用的开发web应用的开发工具,其功能十分强大。今天,小徐就来介绍下如何安装和激活webstorm。文末附获取方式。 如何安装和激活WebStorm 首先,我们打开安装包,双击下,点击运行按钮。然后,我们点击下一步按钮。然后,我们选择要安…

IDEA如何将一行上移或者下移

前言 大家好,我是小徐啊。我们在使用IDEA开发Java应用的时候,都会使用到IDEA的快捷键。这些快捷键帮助我们提高了开发的效率。今天,我要介绍下,在IDEA中如何将某一行代码上移或者下移。这个技巧在我们编写代码的时候还是很有效的。 如何下移一行代码 首先,我们需要打开IDE…

NFS动态存储实战案例

NFS动态存储实战案例Kubernetes 不包含内部 NFS 驱动。你需要使用外部驱动为 NFS 创建 StorageClass。卷插件 内置配置器 配置示例AzureFile ✓ Azure FileCephFS - -FC - -FlexVolume - -iSCSI - -Local - LocalNFS - NFSPortworxVolume ✓ Portworx VolumeRBD ✓ Ceph RBDVsp…

为什么Claude AI在与ChatGPT的竞争中落后——尽管产品更优越

Claude广告由Anthropic开发的Claude AI因其技术能力受到赞誉,有些用户声称它在上下文理解和处理更大文本输入方面优于ChatGPT。然而,一个强大的产品并不一定能直接转化为市场主导地位。尽管Claude AI具有潜力,但在ChatGPT主导的竞争市场中,它却难以获得关注。 问题不在于技…

STM32 IAP(OTA)

一、背景知识STM32启动流程(从内部flash启动)[1]正常情况下,程序从Flash启动时的流程如下:(转载自) https://blog.csdn.net/qq_42190402/article/details/139671333程序从Flash启动,根据中断向量表找到复位中断处理函数的地址。(0x0800 0004处是中断向量表的起始地址,也…

稀疏基因组学:大规模基因组分析的新范式

随着基因测序技术的飞速发展,我们面临着一个巨大的挑战:如何高效地处理和分析海量的基因组数据。 2025年1月21日,发表在《Nature Communications》上的一篇论文提出了一个名为“稀疏化基因组学”(Sparsified Genomics)的新概念,通过系统性地排除基因组序列中的大量碱基,…

【译】我们最喜欢的2024年的 Visual Studio 新功能

去年,Visual Studio 团队发布了许多新的面向开发人员的改进和 AI 集成,其中许多直接来自您在开发者社区的反馈。在这篇文章中,我们将重点介绍2024年团队最喜欢的功能,这些功能可以提高生产力,简化工作流程,并增强您的编码体验。让我们开始吧! 图像悬停预览:立即看到您的…

如何修改PHP网站的名称,以确保名称准确且符合品牌形象?

修改PHP网站的名称是一个重要的任务,它不仅关系到网站的准确性和专业性,还影响到用户体验和品牌形象。以下是详细的步骤和建议:备份现有文件:在进行任何修改之前,务必备份网站的原始文件和数据库,以防止意外情况发生。 确定修改位置:通常,网站名称位于模板文件中,如he…

【分享】晶尊微MC802:打造炫酷触控发光方案,轻松点亮创意未来

MC802 带 2 个自校正容性触摸按键功能和 4 个 I/O 口的单片机,是以 EPROM 作为记忆体的 8 位微控制器,专为多 IO 产品的应用而设计。最近,科技圈出现这样一个好东西。它不仅能随时为手机、耳机等充电设备提供应急充电,还能瞬间变身露营灯、氛围灯、台灯,满足不同场景下的需…

二-2、代码生成-swagger

地址 http://192.168.0.115:39999/swagger-ui.html?docExpansion=none/ 位置步骤配置数据库数据Cb-SYSMICROSERVICE(微服务)Cb-SYSRELATIONTABLE(表)生成代码传参 { "author": "jmc",--作者 "lngmsid": 207,--SYSMICROSERVICE表ID "ln…