尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

P7521 [省选联考 2021 B 卷] 取模 分析
📅 发布时间:2026/6/19 14:45:30

题目概述

给你 \(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)\) 的时间复杂度。

真神啊这题!

相关新闻

  • 实用指南:socketpair深度解析:Linux中的“对讲机“创建器
  • 嵌入式硬件——基于IMX6ULL的UART(通用异步收发传输器) - 教程
  • CSP-S 模拟赛 Day 19

最新新闻

  • 品牌视觉操作系统:用AI实现可追溯、可迭代的VI设计
  • Python毕业设计-基于 Django 与协同过滤算法的图书推荐系统的设计与实现 融合协同过滤算法的智能图书推荐平台(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 2026年6月头部宠物皮肤科医院推荐,宠物眼科/猫咪体检/异宠/宠物皮肤/宠物骨科/猫咪绝育/宠物,宠物皮肤科专家找哪家 - 品牌推荐师
  • 深入解析MPC8360E/MPC8358E处理器接口电气特性与硬件设计实践
  • LLM嵌入技术在表格数据预测中的应用与实践
  • 渗透测试实战:CDN绕过与子域名爆破核心技术解析

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号