AtCoder Beginner Contest 393 —— E - GCD of Subset 补题 + 题解 python
AtCoder Beginner Contest 393
E - GCD of Subset
Problem Statement
You are given a sequence A = ( A 1 , A 2 , … , A N ) A = (A_1, A_2, \dots, A_N) A=(A1,A2,…,AN) of length N N N and a positive integer K K K (at most N N N).
For each i = 1 , 2 , … , N i = 1, 2, \dots, N i=1,2,…,N, solve the following problem:
- When you choose K K K elements from A A A that include A i A_i Ai, find the maximum possible GCD (greatest common divisor) of those chosen elements.
问题陈述
给定一个长度为 N 的序列 A = ( A 1 , A 2 , … , A N ) A = (A_1, A_2, \dots, A_N) A=(A1,A2,…,AN) 和一个正整数 K (最多为
N )。
对于每个 i = 1 , 2 , … , N i = 1, 2, \dots, N i=1,2,…,N ,求解如下问题:
-当您从 A 中选择包含 A i A_i Ai 的 K 元素时,找出这些所选元素的最大可能GCD(最大公约数)。
Constraints
- 1 ≤ K ≤ N ≤ 1.2 × 1 0 6 1 \leq K \leq N \leq 1.2 \times 10^6 1≤K≤N≤1.2×106
- 1 ≤ A i ≤ 1 0 6 1 \leq A_i \leq 10^6 1≤Ai≤106
- All input values are integers.
所有输入值均为整数
Input
The input is given from Standard Input in the following format:
输入来自标准输入,格式如下:
N N N K K K
A 1 A_1 A1 A 2 A_2 A2 … \dots … A N A_N AN
Output
Print N N N lines. The j j j-th line should contain the answer for i = j i=j i=j.
打印 N N N 行。 第 j j j 行应该包含 i = j i=j i=j 的答案。
Sample Input 1
5 2
3 4 6 7 12
Sample Output 1
3
4
6
1
6
For i = 1 i=1 i=1, choosing A 1 A_1 A1 and A 3 A_3 A3 yields gcd ( { 3 , 6 } ) = 3 \gcd(\lbrace 3,6 \rbrace) = 3 gcd({3,6})=3, which is the maximum.
For i = 2 i=2 i=2, choosing A 2 A_2 A2 and A 5 A_5 A5 yields gcd ( { 4 , 12 } ) = 4 \gcd(\lbrace 4,12 \rbrace) = 4 gcd({4,12})=4, which is the maximum.
For i = 3 i=3 i=3, choosing A 3 A_3 A3 and A 5 A_5 A5 yields gcd ( { 6 , 12 } ) = 6 \gcd(\lbrace 6,12 \rbrace) = 6 gcd({6,12})=6, which is the maximum.
For i = 4 i=4 i=4, choosing A 4 A_4 A4 and A 2 A_2 A2 yields gcd ( { 7 , 4 } ) = 1 \gcd(\lbrace 7,4 \rbrace) = 1 gcd({7,4})=1, which is the maximum.
For i = 5 i=5 i=5, choosing A 5 A_5 A5 and A 3 A_3 A3 yields gcd ( { 12 , 6 } ) = 6 \gcd(\lbrace 12,6 \rbrace) = 6 gcd({12,6})=6, which is the maximum.
对于 i = 1 i=1 i=1 ,选择 A 1 A_1 A1 和 A 3 A_3 A3 得到 gcd ( { 3 , 6 } ) = 3 \gcd(\lbrace 3,6 \rbrace) = 3 gcd({3,6})=3 ,这是最大值。
对于 i = 2 i=2 i=2 ,选择 A 2 A_2 A2 和 A 5 A_5 A5 得到 gcd ( { 4 , 12 } ) = 4 \gcd(\lbrace 4,12 \rbrace) = 4 gcd({4,12})=4 ,这是最大值。
对于 i = 3 i=3 i=3 ,选择 A 3 A_3 A3 和 A 5 A_5 A5 得到 gcd ( { 6 , 12 } ) = 6 \gcd(\lbrace 6,12 \rbrace) = 6 gcd({6,12})=6 ,这是最大值。
对于 i = 4 i=4 i=4 ,选择 A 4 A_4 A4 和 A 2 A_2 A2 得到 gcd ( { 7 , 4 } ) = 1 \gcd(\lbrace 7,4 \rbrace) = 1 gcd({7,4})=1 ,这是最大值。
对于 i = 5 i=5 i=5 ,选择 A 5 A_5 A5 和 A 3 A_3 A3 得到 gcd ( { 12 , 6 } ) = 6 \gcd(\lbrace 12,6 \rbrace) = 6 gcd({12,6})=6 ,这是最大值。
Sample Input 2
3 3
6 10 15
Sample Output 2
1
1
1
Sample Input 3
10 3
414003 854320 485570 52740 833292 625990 909680 885153 435420 221663
Sample Output 3
59
590
590
879
879
590
20
879
590
59
题解:
E - GCD of Subset官方题解 by en_translator
One can make the GCD x x x only if:
- A i A_i Ai is divisible by x x x.
- A A A has at least K K K elements divisible by x x x.
The answer is the maximum among such x x x.
To process the conditions above, we precalculate several DP tables. Let M = max ( A ) M = \max(A) M=max(A).
Let s n s_n sn be the number of occurrences of n n n in A A A. s n s_n sn can be constructed in O ( N + M ) \mathrm{O}(N + M) O(N+M) using an array to count the occurrences while scanning A A A.
Next, let t n t_n tn be the number of multiples of n n n in A A A. Here, we will use the notation d ∣ n d \vert n d∣n as “ d d d divides n n n. t n t_n tn and s n s_n sn have the relation
t d = ∑ d ∣ n s n , t_d = \sum_{d \vert n} s_n, td=d∣n∑sn,
so t n t_n tn can be computed in the manner of the following double for
loops.
The complexity of this double for
loop can be bounded by ( M M M times) the so-called harmonic series, so the complexity is O ( M log M ) \mathrm{O}(M \log M) O(MlogM).
Finally, let u n u_n un be the answer for A i = n A_i = n Ai=n. u n u_n un relates t n t_n tn as
u n = max ( { d such that d ∣ n and t d ≥ K } ) , u_n =\max(\left\lbrace d \text{ such that }d \vert n\text{ and }t_d \geq K\right\rbrace), un=max({d such that d∣n and td≥K}),
so u n u_n un can be computed by the following double for
loop. The complexity of this for
statement is also O ( M log M ) \mathrm{O}(M \log M) O(MlogM).
All that left is to compute u A i u_{A_i} uAi for each i i i.
This way, the problem can be solved in a total of O ( N + M log M ) \mathrm{O}(N + M \log M) O(N+MlogM) time and O ( N + M ) \mathrm{O}(N + M) O(N+M) space, which is fast enough.
- Sample code (C++)
As a side note, there are many alternative solutions, including:
- one with time complexity O ( N M + M log M ) \mathrm{O}(N \sqrt{M} + M \log M) O(NM+MlogM),
- one with spacial complexity O ( M log M ) \mathrm{O}(M \log M) O(MlogM).
both solutions will meet the two-second time limit if your implementation is good enough, but especially the former is subject to TLE (Time Limit Exceeded), so please be careful.
只有在以下情况下才能制作GCD x x x :
-
A i A_i Ai 能被 x x x 整除。
-
A A A 至少有 K K K 个元素可以被 x x x 整除。
答案是这些 x x x 中的最大值。
为了处理上述条件,我们预先计算了几个DP表。 M = max ( A ) M = \max(A) M=max(A) 。
设 s n s_n sn 为 n n n 在 A A A 中出现的次数。 s n s_n sn 可以在 O ( N + M ) \mathrm{O}(N + M) O(N+M) 中构造,使用数组来计算扫描 A A A 时的出现次数。
接下来,设 t n t_n tn 为 A A A 中 n n n 的倍数个数。这里,我们将使用 d ∣ n d \vert n d∣n 作为“ d d d 除以 n n n ”。 t n t_n tn 和 s n s_n sn 有关系
t d = ∑ d ∣ n s n , t_d = \sum_{d \vert n} s_n, td=d∣n∑sn,
因此 t n t_n tn 可以用以下双‘ for ’循环的方式计算。
这个双‘for’循环的复杂度可以用( M M M 倍的所谓的调和级数来限定,所以复杂度是 O ( M log M ) \mathrm{O}(M \log M) O(MlogM) 。
最后,设 u n u_n un 为 A i = n A_i = n Ai=n 的答案。 u n u_n un 涉及 t n t_n tn
u n = max ( { d such that d ∣ n and t d ≥ K } ) , u_n =\max(\left\lbrace d \text{ such that }d \vert n\text{ and }t_d \geq K\right\rbrace), un=max({d such that d∣n and td≥K}),
所以 u n u_n un 可以通过下面的双‘ for ’循环来计算。这个‘ for ’语句的复杂度也是 O ( M log M ) \mathrm{O}(M \log M) O(MlogM) 。
剩下的就是为每个 i i i 计算 u A i u_{A_i} uAi 。
这样,总共可以在 O ( N + M log M ) \mathrm{O}(N + M \log M) O(N+MlogM) 时间和 O ( N + M ) \mathrm{O}(N + M) O(N+M) 空间内解决问题,速度足够快。
作为旁注,有许多替代解决方案,包括:
-时间复杂度 O ( N M + M log M ) \mathrm{O}(N \sqrt{M} + M \log M) O(NM+MlogM) ,
-具有空间复杂度 O ( M log M ) \mathrm{O}(M \log M) O(MlogM) 。
如果你的执行足够好,两种方案都可以满足2秒的时间限制,但特别是前者会受到TLE(时间限制超出)的限制,所以请小心。
有点抽象,看不懂官方题解
接下来是我奶奶都能看懂的版本
为了解决问题,我们要找到一个包含给定元素 A i A_i Ai的K个元素的子集,使得这些元素的GCD最大。
方法思路
- 统计每个数的出现次数:我们首先统计每个数在数组中的出现次数。
- 计算每个数的倍数数量:对于每个可能的数d,计算数组中能被d整除的元素的数量。
- 预处理最大GCD:从最大的数开始,检查每个数的倍数数量是否满足要求,并记录每个数的最大GCD。
t 数组的定义
- t t t 数组:
t[d]
是数组中能被d整除的元素的个数
u数组的定义
- u[m]:对于数 (m),它的值是所有满足以下条件的 (d) 中的最大值:
- (d) 是 (m) 的因数
- 数组中有至少 (K) 个元素是 (d) 的倍数
核心思路
-
目标:对于每个元素 ( A i A_i Ai),找到一个最大的数 ( d d d),使得:
- (d) 是 ( A i A_i Ai) 的因数。
- 数组中至少有 (K) 个元素是 (d) 的倍数。
-
关键观察:最大的 (d) 一定是 ( A i A_i Ai) 的因数,且
(t[d] >= k )
。我们需要找出所有满足条件的 (d),并取最大的那个。
code:
from collections import Counter
n, k = map(int, input().split())
a = list(map(int, input().split()))
s = Counter(a)max_m = max(a)
# 计算t数组:t[d]是数组中能被d整除的元素的个数
t = [0] * (max_m + 1)
for d in range(1, max_m + 1):for multiple in range(d, max_m + 1, d):t[d] += s[multiple]# 计算u数组:u[m]是m的最大因数d,满足t[d]>=k
u = [0] * (max_m + 1)
# 从大到小遍历d
for d in range(max_m, 0, -1):if t[d] >= k:for multiple in range(d, max_m + 1, d):if u[multiple] == 0:u[multiple] = d# 输出每个元素的答案
for i in a:print(u[i])
. 更新u数组:
- 对于每个 (d) 的倍数
multiple
,如果u[multiple]
还未被设置(即初始值 0),则将 (d) 赋给它。 - 为什么需要
if u[multiple] == 0
?
因为更大的 (d’)可能已经处理过这些倍数,并设置了更大的值。此时不应覆盖。
为什么这是正确的?
- 覆盖性:所有可能的 (d) 都会被检查。
- 贪心保证最大性:从大到小遍历,确保第一个满足条件的 (d) 就是最大的可能值。
- 因数关系:每个数的因数一定小于或等于它本身,反向遍历确保优先处理更大的因数。
总结
- u数组的作用:记录每个数 (m) 的最大因数 (d),使得 (d) 的倍数数量足够)。
- 反向遍历确保贪心:优先处理更大的 (d),保证结果的最大性。
- 条件判断:仅在
u[multiple]
未被设置时更新,避免覆盖更大的 (d)。
通过这种方式,最终的 u[Ai]
就是每个元素 ( A i A_i Ai) 的答案。
END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢
相关文章:
AtCoder Beginner Contest 393 —— E - GCD of Subset 补题 + 题解 python
AtCoder Beginner Contest 393 E - GCD of Subset Problem Statement You are given a sequence A ( A 1 , A 2 , … , A N ) A (A_1, A_2, \dots, A_N) A(A1,A2,…,AN) of length N N N and a positive integer K K K (at most N N N). For each i 1 , 2 , … …...
vue3响应式丢失解决办法(三)
vue3的响应式的理解,与普通对象的区别(一) vue3 分析总结响应式丢失问题原因(二) 经过前面2篇文章,知道了响应式为什么丢失了,但是还是碰到了丢失情况,并且通过之前的内容还不能解…...

BY组态:构建灵活、可扩展的自动化系统
引言 在现代工业自动化领域,BY组态(Build Your Own Configuration)作为一种灵活、可扩展的解决方案,正逐渐成为工程师和系统集成商的首选。BY组态允许用户根据具体需求自定义系统配置,从而优化生产效率、降低成本并提…...

2025 (ISC)²CCSP 回忆录
2025.1.20 广州,周一,我一次性通过了CCSP的考试。 为什么要考证? 个人成长所需 职业热情:做一行爱一行,既然我投入了美好的青春年华到网络安全行业当中,那么对于这个行业最有权威的认证,是肯定…...

强化学习笔记7——DDPG到TD3
前提:基于TD 的方法多少都会有高估问题,即Q值偏大。原因两个:一、TD目标是真实动作的高估。 二:自举法高估。 DDPG 属于AC方法:异策略,适合连续动作空间,因为他的策略网络直接输出的动作&#…...

win10 系统 自定义Ollama安装路径 及模型下载位置
win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘,以及后续的模型数据下载也在C盘,导致会占用C盘空间,所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址࿱…...
-bash:/usr/bin/rm: Argument list too long 解决办法
问题概述 小文件日志太多导致无法使用rm命令,因为命令行参数列表的长度超过了系统允许的最大值。 需要删除/tmp目录下的所有文件,文件数量比较多。 ls -lt /tmp | wc -l 5682452 解决方法如下: 使用find -exec 遍历,然后执行删…...

内容中台重构企业内容管理流程驱动智能协作升级
内容概要 内容中台作为企业数字化转型的核心基础设施,通过技术架构革新与功能模块整合,重构了传统内容管理流程的底层逻辑。其核心价值在于构建动态化、智能化的内容生产与流转体系,将分散的创作、存储、审核及分发环节纳入统一平台管理。基…...

python实现YouTube关键词爬虫(2025/02/11)
在当今数字化时代,YouTube作为全球最大的视频分享平台之一,拥有海量的视频资源。无论是进行市场调研、内容创作还是学术研究,能够高效地获取YouTube上的相关视频信息都显得尤为重要。今天,我将为大家介绍一个基于Python实现的YouT…...
【效率技巧】怎么做思维导图||数学思维||费曼学习法
目录标题 常见问题:认知误区和建议:思维导图按照功能分类思维导图好处步骤(拆解的步骤) 常见问题: 1、做好的思维导图浪费时间 2、做简单的思维导图没有效果 认知误区和建议: 1、做思维导图工具…...

LabVIEW与USB设备开发
开发一台USB设备并使用LabVIEW进行上位机开发,涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输,帮助用户顺利完成项目开发。下面是一个详细的说明&…...

动态规划LeetCode-416.分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...

云原生(五十五) | ECS中自建数据库迁移到RDS
文章目录 ECS中自建数据库迁移到RDS 一、场景说明 二、ECS中自建数据库迁移到RDS实现步骤 三、 创建wordpress数据库 四、登录ECS导出wordpress数据库 五、返回RDS数据库管理控制台 六、开启外网地址并设置白名单 七、获取RDS外网访问地址 八、重新设置wordpress的wp-…...

【吾爱出品】 视频批量分段工具
视频批量分段工具 链接:https://pan.xunlei.com/s/VOJDvtHQE7GOiJ84WNea5Ay1A1?pwd5nta# 选择视频文件 启动程序后,点击 "文件" 菜单下的 "选择视频文件" 按钮,或者直接将视频文件拖放到程序窗口中的视频列表区域。支…...

HTML【详解】input 标签
input 标签主要用于接收用户的输入,随 type 属性值的不同,变换其具体功能。 通用属性 属性属性值功能name字符串定义输入字段的名称,在表单提交时,服务器通过该名称来获取对应的值disabled布尔值禁用输入框,使其无法被…...
二叉搜索树的实现(C++)
前言 二叉搜索树(搜索二叉树,Binary search tree)是一种特殊的二叉树。其规则为:左子树的值一定小于等于根,右子树的值一定大于等于根,并且左右子树也为搜索二叉树。 二叉搜索树的插入 1.若树为空…...

vue2老版本 npm install 安装失败_安装卡主
vue2老版本 npm install 安装失败_安装卡主 特别说明:vue2老版本安装慢、运行慢,建议升级vue3element plus vite 解决方案1: 第一步、修改npm 镜像为国内镜像 使用淘宝镜像: npm config set registry https://registry.npmmir…...
【MySQL】索引篇
1.什么时候适用索引? 字段有唯一限制,比如商品编码经常用于where查询条件的字段经常用于group by和order by 的字段 2.什么时候不需要创建索引? 字段中存在大量重复经常更新的字段表数据太少的时候 where条件、group by,order by里…...

Arduino 第十六章:pir红外人体传感器练习
Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…...

鸿蒙面试题
1.0penHarmony的系统架构是怎样的? 2.电话服务的框架? 3.OpenHarmony与HarmonyOS有啥区别?...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...