news 2026/6/9 20:03:31

CCF-GESP计算机学会等级考试2025年12月五级C++T2 相等序列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CCF-GESP计算机学会等级考试2025年12月五级C++T2 相等序列

P14918 [GESP202512 五级] 相等序列

题目描述

小 A 有一个包含NNN个正整数的序列A={A1,A2,…,AN}A=\{A_1,A_2,\ldots,A_N\}A={A1,A2,,AN}。小 A 每次可以花费111个金币执行以下任意一种操作:

  • 选择序列中一个正整数AiA_iAi1≤i≤N1\le i\le N1iN),将AiA_iAi变为Ai×PA_i\times PAi×PPPP为任意质数;
  • 选择序列中一个正整数AiA_iAi1≤i≤N1\le i\le N1iN),将AiA_iAi变为AiP\frac{A_i}{P}PAiPPP为任意质数,要求AiA_iAiPPP的倍数。

小 A 想请你帮他计算出令序列中所有整数都相同,最少需要花费多少金币。

输入格式

第一行一个正整数NNN,含义如题面所示。

第二行包含NNN个正整数A1,A2,…,ANA_1,A_2,\ldots,A_NA1,A2,,AN,代表序列AAA

输出格式

输出一行,代表最少需要花费的金币数量。

输入输出样例 #1

输入 #1

5 10 6 35 105 42

输出 #1

8

说明/提示

对于60%60\%60%的测试点,保证1≤N,Ai≤1001\le N,A_i\le 1001N,Ai100

对于所有测试点,保证1≤N,Ai≤1051\le N,A_i\le 10^51N,Ai105

【题解】P14918 [GESP202512 五级] 相等序列

一、题目核心分析

你需要解决的问题是通过最少的金币让序列中所有数相等,核心要点在于理解操作的本质

  • 每次操作是对某个数的质因数指数进行±1(乘质数等价于指数+1,除质数等价于指数-1),每次操作花费1金币。
  • 因此问题可拆解为:对每个质数,调整所有数中该质数的指数到同一个值(最小化总花费),最终将所有质数的花费累加,即为答案。

关键性质

对于一个数组,要调整所有元素到同一个值且总绝对差最小,这个值是数组的中位数(中位数的核心性质:最小化绝对偏差和)。

二、解法思路

整体分为三步:

  1. 质因数分解:将每个数分解为质因数的乘积,统计每个质数在不同数中的指数出现次数。
  2. 找中位数:对每个质数,统计其所有数的指数分布,找到该分布的中位数(最优调整目标)。
  3. 计算总花费:对每个质数,计算所有数的指数到中位数的绝对差之和,累加得到总金币数。
#include<bits/stdc++.h>usingnamespacestd;// 全局变量定义intn;// 序列中元素的个数inta;// 临时存储输入的每个数// m[i][j]:质数i的指数为j的数的个数(i最大1e5,j最大约17<20,足够覆盖)intm[100005][25];longlongans=0;// 总花费(用long long避免int溢出,因为最大可能花费1e5*20=2e6,也可不用但养成习惯)/** * @brief 质因数分解函数:分解单个数字x,统计每个质因数的指数 * @param x 要分解的正整数 */voidfactorize(intx){// 试除法分解质因数,遍历到sqrt(x)即可for(inti=2;i*i<=x;i++){intcnt=0;// 记录当前质数i在x中的指数// 不断除以i,直到无法整除,统计指数while(x%i==0){x/=i;cnt++;}// 如果该质数i在x中存在(指数>0),更新统计数组if(cnt>0){m[i][cnt]++;}}// 若最后剩余的x>1,说明x本身是质数(未被分解),指数为1if(x>1){m[x][1]++;}return;}intmain(){// 第一步:输入序列长度和序列元素cin>>n;for(inti=1;i<=n;i++){cin>>a;factorize(a);// 对每个数进行质因数分解,更新统计数组m}// 第二步:遍历所有可能的质数(1e5以内),计算每个质数的最小花费for(intprime=2;prime<=100000;prime++){// 步骤2.1:统计该质数指数为0的数的个数(即序列中不含该质数的数)intsum_non_zero=0;// 指数≥1的数的个数for(intexp=0;exp<20;exp++){sum_non_zero+=m[prime][exp];}m[prime][0]=n-sum_non_zero;// 指数为0的数 = 总数n - 指数≥1的数// 步骤2.2:找该质数指数分布的中位数(中位数最小化绝对差和)intmedian_exp=0;// 最优调整目标:指数的中位数intcnt=0;// 累加指数的计数,用于找中位数for(intexp=0;exp<20;exp++){cnt+=m[prime][exp];// 累加当前指数exp的数的个数// 当累加数≥n/2时,找到中位数(n为奇数时取中间,偶数时取任意中间均可)if(cnt*2>=n){median_exp=exp;break;}}// 步骤2.3:计算该质数的总花费并累加到答案for(intexp=0;exp<20;exp++){// 每个指数exp的数有m[prime][exp]个,每个数需要调整|exp - median_exp|次ans+=(longlong)m[prime][exp]*abs(exp-median_exp);// 强制转换为long long避免乘法溢出(m[prime][exp]最大1e5,abs最大20,乘积2e6,也可不用但规范)}}// 第三步:输出总最小花费cout<<ans<<endl;return0;}

三、代码逐部分解析

1. 变量与数组定义

  • m[i][j]是核心数组:第一维表示质数i,第二维表示指数j,值为“序列中包含质数i且指数为j的数的个数”。
  • anslong long是因为NA_i最大为1e5,总花费可能超过int范围。

2. 质因数分解函数

  • 功能:对单个数字做质因数分解,更新m数组统计指数分布。
  • 试除法:从2到√x遍历,找到所有质因数及其指数;若最后x>1,说明x本身是质数,统计其指数为1。

3. 主函数逻辑

关键步骤解释:
  • 统计指数0的个数:初始时m[i][0]为0,需要计算“没有该质数的数”的数量(即指数为0)。
  • 找中位数k:通过累加指数j的计数s,当s×2≥n时,j就是中位数(例如n=5时,s≥3即找到中位数)。
  • 计算单个质数的花费:每个指数j的数有m[i][j]个,每个数需要调整|j-k|次,总花费为m[i][j]×|j-k|,累加到ans

五、总结

核心关键点

  1. 问题转化:将“乘/除质数”的操作转化为“调整质因数指数”,把原问题拆解为多个独立的“中位数最小化绝对差”子问题。
  2. 中位数最优:对单个质数的指数分布,选择中位数作为调整目标,能保证该质数的总花费最小。
  3. 质因数分解:用试除法高效分解1e5以内的数,确保时间复杂度可接受。

时间复杂度

  • 质因数分解:每个数分解的时间为O(Ai)O(\sqrt{A_i})O(Ai),总时间O(NAi)O(N\sqrt{A_i})O(NAi)Ai≤1e5A_i≤1e5Ai1e5Ai≈300\sqrt{A_i}≈300Ai300N≤1e5N≤1e5N1e5,总操作约3e7,可通过)。
  • 遍历质数:1e5以内的质数遍历,内层循环最多20次,时间可忽略。

该解法通过“分解问题+利用中位数性质”,高效且正确地解决了题目要求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:48:23

GLM-4.6V-Flash-WEB能否理解病理切片图像?

GLM-4.6V-Flash-WEB能否理解病理切片图像&#xff1f; 在数字病理学迅速发展的今天&#xff0c;一张乳腺组织的HE染色切片图像上传到系统后&#xff0c;医生并不需要手动圈出可疑区域——他只需问一句&#xff1a;“图中是否有导管内癌迹象&#xff1f;”几秒钟后&#xff0c;A…

作者头像 李华
网站建设 2026/6/9 18:50:52

GitHub Desktop汉化终极指南:3步实现界面完全中文化

GitHub Desktop汉化终极指南&#xff1a;3步实现界面完全中文化 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 还在为GitHub Desktop的全英文界面而头疼吗&#xff1f…

作者头像 李华
网站建设 2026/6/6 7:38:36

【Dify开发避坑指南】:为什么你的附件ID总是无效?真相在这

第一章&#xff1a;Dify 附件 ID 存在性在 Dify 平台中&#xff0c;附件 ID 是标识用户上传文件的唯一凭证。验证附件 ID 的存在性是确保后续操作&#xff08;如下载、解析或关联到工作流&#xff09;能够正确执行的前提条件。系统通过 RESTful API 提供接口用于查询指定附件 I…

作者头像 李华
网站建设 2026/6/6 7:26:15

如何快速掌握mimalloc:高性能内存分配器的完整实战指南

想要让你的C/C应用性能获得质的飞跃吗&#xff1f;微软研究院开发的mimalloc内存分配器正是你需要的利器。作为一款紧凑型通用内存分配器&#xff0c;mimalloc在性能表现上全面超越传统malloc和其他主流分配器&#xff0c;是优化应用性能的高效工具。 【免费下载链接】mimalloc…

作者头像 李华
网站建设 2026/6/7 20:06:37

Kepler.gl完整入门指南:5步掌握免费地理数据可视化工具

Kepler.gl完整入门指南&#xff1a;5步掌握免费地理数据可视化工具 【免费下载链接】kepler.gl keplergl/kepler.gl: Kepler.gl 是一个由 Uber 开发的数据可视化工具&#xff0c;提供了一个基于 WebGL 的交互式地图可视化平台&#xff0c;可以用来探索大规模地理空间数据集。 …

作者头像 李华
网站建设 2026/6/5 12:12:06

GLM-4.6V-Flash-WEB在市场调研报告生成中的辅助作用

GLM-4.6V-Flash-WEB在市场调研报告生成中的辅助作用 在当今信息爆炸的商业环境中&#xff0c;市场调研人员每天面对海量的非结构化数据&#xff1a;电商平台截图、广告海报、社交媒体图文、竞品详情页……这些图像中蕴藏着消费者偏好、营销策略和竞争态势的关键线索。然而&…

作者头像 李华