P7521 [省选联考 2021 B 卷] 取模 分析

news/2025/10/20 20:26:05/文章来源:https://www.cnblogs.com/high-sky/p/19153584

题目概述

给你 \(n\) 个数 \(a_i\)

求:\(\max_{i\ne j\ne k}(a_i+a_j)\bmod a_k\)

分析

好题!

我一开始看到是无从下手的。

但是细想一下,关键点在于 \(a_k\),所以的说,枚举 \(a_k\) 是必不可少的。

然后我们令剩余的数全部对 \(a_k\) 取模,得到答案的途径有两种:

  • \(b_i+b_j\geq a_k\),因为两者相加最多减去一个 \(a_k\),这种情况直接取两个最大的就行了,时间复杂度 \(mathcal{O}(n\log n)\)
  • \(b_i+b_j< a_k\),这个用 \(l,r\) 双指针框住区间取两端即可,相当于枚举 \(l\),那么所对应的 \(r\) 是单调递减的,时间复杂度 \(\mathcal{O}(n\log n)\)

两者都需要先排序。

对于每一个 \(a_k\) 都做一遍这个我们是承担不起的。

那么贪心地先做大的 \(a_k\),这个是显然的。

如果过说我现在的 \(ans\) 不小于当前的模数(因为在此种情况下不可能存在更大的解),直接退出即可。

那么这个剪枝是很强的(还需要注意对于相等的 \(a_k\) 只做一遍,怕那种全都是一样的数据)。

可以证明一下。

代码

时间复杂度 \(\mathcal{O}(n\log V\log n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define int long long
#define N 200005
using namespace std;
int n,a[N],b[N];
int solve(int id) {int cnt = 0;for (int i = 1;i <= n;i ++)if (i != id) b[++cnt] = a[i] % a[id];stable_sort(b + 1,b + 1 + cnt);int res = (b[cnt] + b[cnt - 1]) % a[id];for (int l = 1,r = cnt;l < r;l ++) {while(l < r && b[r] + b[l] >= a[id]) r --;if (l < r) res = max(res,b[l] + b[r]);}return res;
}
signed main(){cin >> n;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]);stable_sort(a + 1,a + 1 + n,greater<int>());int ans = 0;for (int i = 1;i <= n;i ++) {if (ans >= a[i]) break;if (a[i] == a[i - 1]) continue;ans = max(ans,solve(i));}cout << ans;return 0;
}

证明时间复杂度

假设:

\[a_1>a_2>\dots>a_x>ans>a_{x+1}>\dots>a_n \]

因为 \(ans\) 是最大的答案,根据第一部分我们对于任意 \(i(1\leq i\leq x-2)\) 有:

\[(a_{i+1}+a_{i+2})\bmod a_i\leq ans \]

因为:

\[a_i>a_{i+1}>a_{i+2}>ans \]

所以:

\[(a_{i+1}+a_{i+2})\bmod a_i\leq ans<a_{i+1}+a_{i+2}<2a_i \]

因此我们至少有:

\[a_i\leq a_{i+1}+a_{i+2}<2a_i \]

这就说明了中间的那个式子要是与左边的式子多加上一个 \(a_i\) 比较那肯定是变小的。

我们此时联系上一个式子,把 \(ans\) 换代进来也是一样地有:

\[ans<a_{i+1}+a_{i+2}<ans+a_i \]

注意后面的式子,我们考虑同构,于是左右两边同时减去 \(2ans\) 有:

\[(a_{i+1}-ans)+(a_{i+2}-ans)<a_i-ans \]

同构了!令 \(f_i=a_i-ans\) 那么有:

\[f_{i+1}+f_{i+2}<f_i \]

这很像一个倒着的斐波那契数列,这个东西是呈指数级增长的,所以说是 \(\mathcal{O}(\log V)\) 的时间复杂度。

真神啊这题!

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

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

相关文章

4060显卡也能玩转AI改图!Flux.1 Kontext Dev GGUF版本超详细入门教程 - 实践

4060显卡也能玩转AI改图!Flux.1 Kontext Dev GGUF版本超详细入门教程 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

提升生产力:8个.NET开源且功能强大的快速开发框架

提升生产力:8个.NET开源且功能强大的快速开发框架今天大姚给大家分享8个.NET开源、免费、功能强大的快速开发框架。助你提高开发生产效率、避免996!!! Vue.NetCore 一款基于Vue(提供Vue2/Vue3版本)和.Net Core前…

Mac版PDF Squeezer v4.5.1安装教程(DMG文件下载+详细步骤)​

Mac版PDF Squeezer v4.5.1安装教程(DMG文件下载+详细步骤)​​PDF Squeezer​ 是一款 ​Mac 专用​ 的 PDF 压缩工具,可以 ​快速减小 PDF 文件大小,同时尽量保持文件清晰度,适合 ​邮件发送、云端存储或节省空间…

使用c++14标准实现函数注册包装

调用方式bool res = FunctionRegistry::callFromFuncMap1<bool, type1&, type2*, type3,... >(...),其中第一个bool为返回值类型,第二个开始后面均为参数列表类型,可用于注册算子,包装函数指针等。 #inc…

【VSCode中Java创建环境安装的三个层级之Maven篇】(Windows版)

【VSCode中Java创建环境安装的三个层级之Maven篇】(Windows版)2025-10-20 20:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

黑马程序员Java基础笔记

目录类执行顺序继承方法重写构造器多态抽象类接口枚举类字符串内部类匿名内部类拆箱与装箱克隆浅克隆:深克隆:正则表达式Lambda方法引用静态方法引用实例方法引用特定类型方法引用构造器引用泛型通配符集合Collectio…

实用指南:linux磁盘空间爆满排查与清理

实用指南:linux磁盘空间爆满排查与清理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

实用指南:socketpair深度解析:Linux中的“对讲机“创建器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:从零开始的C++学习生活 2:类和对象(上)

详细介绍:从零开始的C++学习生活 2:类和对象(上)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

【aigc】chrome-devtools-mcp怎么玩? - 指南

【aigc】chrome-devtools-mcp怎么玩? - 指南2025-10-20 20:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

2025年不锈钢酸洗钝化液厂家推荐排行榜,环保型不锈钢管酸洗钝化液,不锈钢清洗钝化液,酸洗钝化处理工艺及不锈钢清洗剂公司推荐

2025年不锈钢酸洗钝化液厂家推荐排行榜:环保型不锈钢管酸洗钝化液技术解析与选购指南 行业背景与发展趋势 不锈钢材料因其优异的耐腐蚀性和美观性,在石油化工、食品医药、建筑装饰等领域得到广泛应用。随着环保政策的…

记账:流水报表

流水报表展示收入、支出、转账的流水条数,可用于判断记账的活跃状况(用处不大,由于只需在现有的设计上改动少许即可,因此顺手做了)查询流水报表:底部ledgers直接输入4(3表示出入报表),分组等其他条件可选下面…

2025年法兰保护罩厂家推荐排行榜,阀门保温罩,法兰罩,法兰防溅罩,法兰保护套,专业防护与定制服务优质供应商

2025年法兰保护罩厂家推荐排行榜:专业防护与定制服务优质供应商深度解析 在工业防护领域,法兰保护罩、阀门保温罩、法兰罩、法兰防溅罩、法兰保护套等产品已成为现代工业安全防护体系不可或缺的重要组成部分。随着工…

英伟达微型AI工作站的架构解析与性能突破

本文深入解析英伟达最新发布的DGX Spark微型AI工作站技术架构,包括GB10芯片设计、内存带宽优化、高速网络互联等关键技术特性,以及其在AI推理和模型训练方面的实际应用表现。英伟达微型Grace-Blackwell工作站正式上市…

百度网盘非会员下载慢怎么解决 - fosgrignonhto

今天教大家一下这个百度网盘非会员下载慢怎么解决,之前,我也是被这个速度所无语,根本下不动,后面没办法了。只能上一些工具啥的,真让我找到一个方法。地址获取:放在这里了,可以直接获取这就是我测试的速度,还是…

嵌入式硬件——基于IMX6ULL的UART(通用异步收发传输器) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20232418 2025-2026-1 《网络与系统攻防技术》实验二实验报告

20232418 2025-2026-1 《网络与系统攻防技术》实验二实验报告 一、实验环境 VMware Workstation pro环境下安装kali-linux-2025.2-installer-amd64.iso镜像二、实验内容 1使用netcat获取主机操作Shell,cron启动某项任…

CF1777E Edge Reverse

强化限制,考虑将翻转一条边变为可以任意走这条无向边,发现不会影响答案(因为最终肯定存在一种遍历方式使得其不会走回来),此时这个问题就很好解决了,当成有向图,考虑先缩点。此时要求入度为 \(0\) 的大点只有一…

d435i 标定 imu和相机 用来复现vins_fusion - 教程

d435i 标定 imu和相机 用来复现vins_fusion - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…