当前位置: 首页 > news >正文

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 1KN1.2×106
  • 1 ≤ A i ≤ 1 0 6 1 \leq A_i \leq 10^6 1Ai106
  • 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 dn 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=dnsn,

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 dn and tdK}),

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 dn 作为“ 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=dnsn,

因此 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 dn and tdK}),

所以 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最大。

方法思路

  1. 统计每个数的出现次数:我们首先统计每个数在数组中的出现次数。
  2. 计算每个数的倍数数量:对于每个可能的数d,计算数组中能被d整除的元素的数量。
  3. 预处理最大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),使得:

    1. (d) 是 ( A i A_i Ai) 的因数。
    2. 数组中至少有 (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官网地址&#xff1…...

-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、做思维导图工具&#xf…...

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.若树为空&#xf…...

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 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

如何将联系人从 iPhone 转移到 Android

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

2025盘古石杯决赛【手机取证】

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

Linux 内存管理实战精讲:核心原理与面试常考点全解析

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

push [特殊字符] present

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

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...