CF2013E Prefix GCD

【题目大意】

给定一个长度为 n n n 的数列 a 1 … n a_{1 \dots n} a1n,你可以将 a 1 … n a_{1 \dots n} a1n 按照任意顺序进行重排,使得:

∑ i = 1 n gcd ⁡ { a 1 , a 2 , a 3 , … , a n } \sum\limits_{i=1}^{n}\gcd\left \{ a_{1},a_{2},a_{3},\dots,a_{n}\right \} i=1ngcd{a1,a2,a3,,an}

最小。其中 gcd ⁡ { a 1 , a 2 , … , a n } \gcd\left \{ a_{1},a_{2},\dots,a_{n}\right \} gcd{a1,a2,,an} 表示 a 1 , a 2 , … , a n a_{1},a_{2},\dots,a_{n} a1,a2,,an 的最大公因数。

【输入格式】

第一行一个整数 t t t,表示共有 t t t 组数据。

每组数据第一行一个整数 n ( 1 ≤ n ≤ 1 × 1 0 5 ) n(1 \leq n \leq 1 \times 10^{5}) n(1n1×105),表示数列的长度。

第二行 n n n 个整数,表示 a 1 … n a_{1 \dots n} a1n。保证 1 ≤ a i ≤ 1 × 1 0 5 1 \leq a_{i} \leq 1 \times 10^{5} 1ai1×105

保证所有测试数据的 n n n max ⁡ 1 ≤ i ≤ n { a i } \max\limits_{1 \leq i \leq n}\left \{ a_{i}\right \} 1inmax{ai} 的总和不会超过 1 × 1 0 5 1 \times 10^{5} 1×105

【输出格式】

t t t 行,每行一个整数,表示答案。

【样例解释】
  • 对于第一组测试数据,你可以以 [ 2 , 4 , 2 ] [2,4,2] [2,4,2] 的顺序重排数列,这样答案为 2 + 2 + 2 = 6 2+2+2=6 2+2+2=6 最小。
  • 对于第三组测试数据,你可以以 [ 6 , 10 , 15 ] [6,10,15] [6,10,15] 的顺序重排数列,这样答案为 6 + 2 + 1 = 9 6+2+1=9 6+2+1=9 最小。

Translated by HPXXZYY, not by ChatGPT.

和洛谷上的翻译大体相同,因为是同一个人翻译的。

[Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis]

这题可以贪心。

正解就是把最小的 a i a_{i} ai 放到最前面,然后每次选取和它的 gcd 最小的那一个数。

可是,为什么这样是对的?

先证明把最小的 a i a_{i} ai 放在最前面最优。

先证明引理:若 a < b a<b a<b,有 a + gcd ⁡ ( a , b ) ≤ b a+\gcd(a,b) \leq b a+gcd(a,b)b

我们知道 gcd ⁡ ( a , b ) = gcd ⁡ ( a , b − a ) = gcd ⁡ ( b , b − a ) ≤ ( b − a ) \gcd(a,b)=\gcd(a,b-a)=\gcd(b,b-a)\leq (b-a) gcd(a,b)=gcd(a,ba)=gcd(b,ba)(ba),所以 a + gcd ⁡ ( a , b ) = a + gcd ⁡ ( a , b − a ) ≤ a + ( b − a ) = b a+\gcd(a,b)=a+\gcd(a,b-a) \leq a+(b-a) = b a+gcd(a,b)=a+gcd(a,ba)a+(ba)=b

所以,如果将较大的 a k a_{k} ak 放在前面的话,我们来看一张图(假设 A A A 是最小的元素):

在这里插入图片描述

我们可以发现,上面蓝色部分对应的 1 , 2 , 3 1,2,3 1,2,3(代表算到这个数时的前缀 gcd),会分别大于等于下面红色的 1 , 2 , 3 1,2,3 1,2,3。且上面蓝色算到 A A A 的前缀 gcd 至少为 1 1 1。所以上面的蓝色的前缀 gcd 和为 b + 1 + 2 + 3 + 4 ≥ b + 1 + 2 + 3 + 1 b+\color{blue}{1+2+3+4} \geq b+\color{blue}{1+2+3}\color{black}{+1} b+1+2+3+4b+1+2+3+1。但是下面的前缀 gcd 的和为 a + gcd ⁡ ( a , b ) + 1 + 2 + 3 ≤ b + 1 + 2 + 3 a+\gcd(a,b)+\color{red}{1+2+3} \color{black}{\leq b+}\color{blue}{1+2+3} a+gcd(a,b)+1+2+3b+1+2+3。所以显然下面的情况更优。

后面的贪心过程同理可以证明。

由于每次取 gcd 都会比上一次至少减少一半,所以时间复杂度为 O ( n log ⁡ max ⁡ { a i } ) O(n \log \max\{a_{i}\}) O(nlogmax{ai})

Code \color{blue}{\text{Code}} Code

const int N=1e5+100;
typedef long long ll;const int inf=0x3f3f3f3f;int n,a[N],lst,now,T;
ll ans;int HPXXZYY(){n=read();for(int i=1;i<=n;i++)a[i]=read();sort(a+1,a+n+1);if (n==1) return printf("%d\n",a[1]);now=a[1];for(int i=2;i<=n;i++)now=gcd(now,a[i]);ans=1ll*now*n+(a[1]-now);lst=a[1];int tmp=now;while (true){now=inf;for(int i=1;i<=n;i++)now=min(now,gcd(lst,a[i]));lst=now;ans+=lst-tmp;if (lst==tmp) break;}return printf("%lld\n",ans);
}int main(){T=read();while (T--) HPXXZYY();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何向文科生解释什么是计算机的缓存

缓存&#xff08;Cache&#xff09;是计算机系统中的一个至关重要的技术概念&#xff0c;用于提高数据访问的速度。我们可以把缓存想象成一个临时的存储区域&#xff0c;它存放着系统中常用或最近使用的数据&#xff0c;以便快速访问&#xff0c;而不必每次都从速度较慢的原始数…

新编英语语法教程

新编英语语法教程 1. 新编英语语法教程 (第 6 版) 学生用书1.1. 目录1.2. 电子课件 References A New English Grammar Coursebook 新编英语语法教程 (第 6 版) 学生用书新编英语语法教程 (第 6 版) 教师用书 1. 新编英语语法教程 (第 6 版) 学生用书 https://erp.sflep.cn/…

拒绝踏空和卖飞,魔改CCI指标主升浪战法!

〇、写在前边 其实最应该学习量化的&#xff0c;就是散户。 作为散户&#xff0c;我们能获取的只有公开信息&#xff0c;这使得我们天然就落后于机构、大户和内幕狗。 那么我们可以利用公开信息来提升投资表现吗&#xff1f;当然可以。 网上有大量免费或者低成本就能获取的…

野火STM32F103VET6指南者开发板入门笔记:【1】点亮RGB(基于结构体)

文章目录 硬件介绍软件介绍&#xff1a;结构体方式软件介绍&#xff1a;宏定义方式 硬件介绍 提示&#xff1a;本文是基于野火STM32F103指南者开发板所写例程&#xff0c;其他开发板请自行移植到自己的工程项目当中即可。 RGB-LEDPin引脚&#xff1a;低电平-点亮&#xff0c;高…

表达式求值(可以计算两位数以上)

此程序可计算两位数以上的表达式 import java.util.Stack;public class ExpressionEvaluator {public int evaluate(String s) {Stack<Integer> numbers new Stack<>();Stack<Character> operators new Stack<>();int i 0;char c s.charAt(i);whil…

灵足时代:具身智能核心部件的新秀崛起——解析数千万元天使轮融资

在智能科技日新月异的今天,具身智能作为连接物理世界与数字世界的重要桥梁,正逐步成为科技创新的前沿阵地。近日,具身智能核心部件领域的新锐公司——“灵足时代”宣布完成数千万元天使轮融资,这一消息无疑为行业内外带来了强烈的震撼与期待。本轮融资由雅瑞智友科学家基金…

在 MySQL 中处理和优化大型报告查询经验分享

在 MySQL 数据库的使用过程中&#xff0c;我们经常会遇到需要生成大型报告的情况&#xff0c;这些查询可能涉及大量的数据和复杂的计算&#xff0c;对数据库的性能提出了很高的要求。 一、问题背景 大型报告查询通常具有以下特点&#xff1a; 数据量大&#xff1a;涉及大量的…

【2024年最新】基于Spring Boot+vue的旅游管理系统lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

用js和css实现一行一行文字交替显示

用js和css实现&#xff0c;效果是&#xff1a;有多行文字&#xff0c;一行一行的交替显示&#xff0c;每隔几秒显示一行&#xff0c;循环显示。 代码如下&#xff0c;保存为html即可看到效果&#xff1a; <!DOCTYPE html> <html lang"en"> <hea…

数据库软题6.1-关系模式-关系模式的各种键

关系模式的各种键 题1-由关系模式求候选键 1. 候选键唯一不冗余 对选项进行闭包运算&#xff0c;如果得到全部属性U&#xff0c;则为候选码 A:AC-ABC-ABCD B:AB-ABC-ABCD C:AE-ABE-ABCE -ABCDE-ABCDEH D:DE2. R的候选码可以从A1,A2,A3,A1A2,A1A3,A2A3,A1A2A3中选择&#xff…

JC2804快速入门

目录 一、硬件接线二、软件操作2.1、CAN分析仪2.2、默认参数2.3、读取校准参数2.4、闭环控制2.5、调整PI参数2.6、切换控制模式 三、其它CAN模块操作3.1、使用CANable3.2、发送指令3.3、其它 一、硬件接线 红色接电源正极&#xff0c;黑色接电源负极&#xff0c;电源电压7—12V…

每日一道算法题——二分查找

文章目录 开口闭口区分:1、问题2、示例3、解决方法&#xff08;1&#xff09;注意点&#xff08;2&#xff09;代码 开口闭口区分: 开口闭口区分: [1,2,3] 左闭右闭[1,2,3) 左闭右开(1,2,3] 左开右闭 开口如数组(1,2,3)不包含当前数据&#xff0c;也就是指只有2&#xff0c;闭口…

分布式锁--redission 最佳实践!

我们知道如果我们的项目服务不只是一个实例的时候&#xff0c;单体锁就不再适用&#xff0c;而我们自己去用redis实现分布式锁的话&#xff0c;会有比如锁误删、超时释放、锁的重入、失败重试、Redis主从一致性等等一系列的问题需要自己解决。 当然&#xff0c;上述问题并非无…

【Java】—— 泛型:泛型的理解及其在集合(List,Set)、比较器(Comparator)中的使用

目录 1. 泛型概述 1.1 生活中的例子 1.2 泛型的引入 2. 使用泛型举例 2.1 集合中使用泛型 2.1.1 举例 2.1.2 练习 2.2 比较器中使用泛型 2.2.1 举例 2.2.2 练习 1. 泛型概述 1.1 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&…

【JavaEE】——文件IO

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;认识文件 1&#xff1a;文件的概念 2&#xff1a;文件的结构 3&#xff1a;文件路径…

【操作系统】体系结构

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 操作系统的内核 操作系统结构——分层结构 操作系统结构——模块化 操作系统结构——宏内核、微内核…

修改Anaconda虚拟环境默认安装路径(Linux系统)

文章目录 修改Anaconda虚拟环境默认安装路径(Linux系统)1.方法一&#xff1a;使用--prefix参数2.方法二&#xff1a;配置conda环境的默认安装位置 修改Anaconda虚拟环境默认安装路径(Linux系统) 1.方法一&#xff1a;使用--prefix参数 在创建虚拟环境时&#xff0c;使用--pre…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…

【可视化大屏】将柱状图引入到html页面中

到这里还是用的死数据&#xff0c;先将柱状图引入html页面测试一下 根据上一步echarts的使用步骤&#xff0c;引入echarts.js后需要初始化一个实例对象&#xff0c;所以新建一个index.js文件来进行创建实例化对象和配置数据信息等。 //在index.html引入<script src"j…

Python爬虫使用实例-mdrama

一个Python爬虫使用实例&#xff1a;主要用于下载指定的剧集音频。分别从网页和json文件中获取剧集的title和剧集中所存在音频的id&#xff0c;调用you-get&#xff0c;最后自动重命名下载文件夹为剧集名title。 目标网址&#xff1a; https://www.missevan.com/mdrama/其中为…