CF1285F Classical? 题解

news/2025/3/26 3:34:19/文章来源:https://www.cnblogs.com/Scarab/p/18788857

Description

\(n\) 个整数 \(a_1,a_2,\ldots,a_n\),求 \(\displaystyle\max_{1\leq i<j\leq n}(\text{lcm}(a_i,a_j))\)

\(n,a_i\leq 10^5\)

Solution

先枚举 \(d=\gcd(a_i,a_j)\),题目转化求序列中互质的一对数的乘积的最大值。

考虑从大到小枚举 \(a_i\),同时维护一个单调栈表示可能成为答案的互质数对的数。

如果当前栈里面存在一个数 \(x\)\(a_i\) 互质,则所有小于 \(x\) 的数一定不可能成为答案,暴力弹栈找到最大的 \(x\) 即可。

但是如果里面不存在的话暴力弹栈复杂度是错的。

考虑怎么判断里面是否存在和 \(a_i\) 互质的数。

这等价于求 \(\sum{\varepsilon(\gcd(a_i,a_j))}=\sum_{d|a_i}\mu(d)\sum[d|a_j]\),维护单调栈时对于所有 \(a_j\) 的因数修改即可。

时间复杂度:\(O(n\log^2V)\)


但是还可以更优。注意到 \(\text{lcm}(a_i,a_j)=a_i\times\frac{a_j}{\gcd(a_i,a_j)}\),由于 \(a_i\)\(a_j/\gcd(a_i,a_j)\) 互质,所以把所有 \(a_i\) 的因数加入序列再做上面的做法答案也是对的。

时间复杂度:\(O(V\log V)\)

Code

#include <bits/stdc++.h>// #define int int64_tconst int kMaxN = 1e5 + 5;int n, mx; int64_t ans;
int a[kMaxN], mu[kMaxN], s[kMaxN];
bool exi[kMaxN];
std::vector<int> d[kMaxN];void prework(int n = mx) {static int prime[kMaxN];static bool vis[kMaxN];for (int i = 1; i <= n; ++i)for (int j = i; j <= n; j += i)d[j].emplace_back(i);int m = 0;mu[1] = 1;for (int i = 2; i <= n; ++i) {if (!vis[i]) {mu[i] = -1, prime[++m] = i;}for (int j = 1; j <= m && i * prime[j] <= n; ++j) {int x = i * prime[j];vis[x] = 1;if (i % prime[j]) mu[x] = -mu[i];else break;}}
}void upd(int x, int v) {for (auto i : d[x]) s[i] += v * mu[i];
}int get(int x) {int ret = 0;for (auto i : d[x]) ret += s[i];return ret;
}void dickdreamer() {std::cin >> n;for (int i = 1; i <= n; ++i) {std::cin >> a[i];mx = std::max(mx, a[i]);if (exi[a[i]]) ans = std::max<int64_t>(ans, a[i]);exi[a[i]] = 1;}prework();for (int i = mx; i; --i)for (int j = 2 * i; j <= mx; j += i)exi[i] |= exi[j];static int stk[kMaxN];int top = 0;for (int i = mx; i; --i) {if (!exi[i]) continue;if (get(i)) {while (true) {for (; top && std::__gcd(i, stk[top]) != 1; --top) upd(stk[top], -1);assert(top);ans = std::max<int64_t>(ans, 1ll * i * stk[top]);upd(stk[top], -1);if (get(i)) {--top;} else {upd(stk[top], 1);break;}}}stk[++top] = i, upd(i, 1);}std::cout << ans << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;// std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

大型通用电子制造执行系统(MES)

​简介:系统参考西门子MOM智能制造Opcenter工业软件制造执行系统Camstar电子套件人机料法环数据建模业务对象和车间生产执行事务逻辑,采用面向对象分层设计与C#编程开发:包含电子制造企业人机料法环业务数据建模实体对象,数据实体持久化映射,数据工厂会话配置,车间生产服务…

物料需求波动大、生产计划变化频繁?一文教你用工厂ERP系统MRP精确计算生产物料!

今天咱们来聊一聊一个大多数工厂都会遇到的问题: 物料需求波动大 和 生产计划变化频繁 。 这些问题可能让你在生产过程中经常“踩雷”,比如物料没采购够,生产停工; 或者物料买多了,库存积压,浪费了钱。有没有办法避免这些问题呢? 答案是: 有 !那就是通过工厂的 ERP系统…

docker使用GPU总结

在docker容器中使用显卡 一 docker19.03以前的事情 1.1 指定显卡硬件名 最初的容器中使用显卡,需要指定硬件名。经历了两种方式使用lxc驱动程序运行docker守护进程,以便能够修改配置并让容器访问显卡设备(非常麻烦,参考链接中最久远的回答)Docker 0.9中放弃了lxc作为默认执…

掌握 K8s Pod 基础应用 (二)

Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:pod创建过程运行初始化容器(init container)过程运行主容器(main container)容器启动后钩子(post start)、容器终止前钩子(pre stop)容器的存活性探测(liveness prob…

叉车人员防撞报警系统

叉车人员防撞报警系统采用机器视觉图像感知技术,通过人工智能深度学习技术,对行人和车辆的精确检测,叉车人员防撞报警系统实现对人体和车辆检测分析识别,在机器视觉图像景中,通过特征识别算法建立人体和车辆图像模型,完成自动识别目标,并能以视觉图像智能分析精确区分干…

课堂在线点名助手

适合老师上课随机提问学生的小工具。前情概要 为提高程序的普适性,学生姓名用学号代替。 在线点卯在线提问点名助手body0 { font-family: Arial, sans-serif; background-image: url(https://img2024.cnblogs.com/blog/992978/202503/992978-20250324092106498-1518746661.jpg…

随堂笔记之Java方法

此内容源自B站狂神说Java基础的课后笔记与总结,用于复习和查看,因此写得比较简陋,不太适合萌新学习 方法定义方法调用 调用方法:对象名.方法名(实参列表)方法返回一个值的时候,方法调用通常被当做一个值 方法返回值是void,方法调用是一条语句*值传递和引用传递: Java全…

3.24

Android Studio 启动模拟器出现“Timed out after 300seconds waiting for emulator to come online“解决方案 问题: Timed out after 300seconds waiting for emulator to come online.**解决方法: 检查自己的Emulator是否是最新版本,如果不是检查更新到最新

使用ESP32的语音到文本转换

ESP32 + INMP441麦克风+ SD卡+ Deepgram API =语音到文本只需3秒!即时记录、存储和转录。现在就试试! 最快!使用ESP32板的语音到文本转换语音转文本技术改变了许多项目的游戏规则。从在智能家居中实现免提控制到为残疾人创建无障碍解决方案,将口语转换为文本的能力打开了无限的…

SNeP软件计算有效群体大小

001、官网: https://sourceforge.net/projects/snepnetrends/002、脚本: SNeP1.1 -ped sample_name.ped -map sample_name.map -threads 10 -ld -out ./sample_name003、结果文件:。

2025.3.28(周五)

android实验二第三部分 事情处理 1. 点击事件 (OnClickListener) 方法:setOnClickListener(View.OnClickListener listener) android:onClick(在 XML 中使用) 核心功能:处理按钮、文本、图片等控件的 单击事件。 使用场景:按钮提交、页面跳转、功能触发等。 2. 长按事件 (…

关于原生小程序canvas标签始终显示再最上层问题

官方说明: https://developers.weixin.qq.com/miniprogram/dev/component/native-component.html 解决方法:将canvas正常绘制 对canvas进行定位,远离手机屏幕显示区域 将canvas转换为img图片,将转换后的图片进行展示 如果图片清晰度不够,则将canvas成倍的绘制,将转换后的…