P13016 [GESP202506 六级] 最大因数

GESP六级真题考点分析和解题思路 本文分析了GESP六级考试的18道真题,涵盖动态规划、树形结构、图论算法等核心考点。重点题目包括下楼梯(动态规划)、工作沟通(LCA算法)、运送物资(网络流)等。试题难度以普及级为主,涉及拓扑排序、树形DP、二分答案等典型算法。备考建议掌握动态规划状态转移、树结构的DFS遍历、图论算法实现等关键技能,并熟悉提供的代码模板(如拓扑排序和树直径计算)。通过系统练习这些高频题型和算法模板,可以有效提升六级考试通过率。 阅读详情

记录129

#include<bits/stdc++.h>
using namespace std;
int q;//定义全局变量q,表示询问的组数
//自定义函数:求节点x的父节点(即x除以它的最小质因数)
int get_par(int x){
	if(x==1)return 0;//特判:根节点1没有父节点,返回0
	for(int i=2;i*i<=x;i++){//从2开始遍历到根号x,寻找x的最小质因数
		if(x%i==0)return x/i;//如果i能整除x,说明i是最小质因数,返回x/i即为最大真因数(父节点)
	}
	return 1;//如果循环结束都没找到因数,说明x是质数,父节点直接返回1
}
//自定义函数:计算两个节点x和y在树上的距离
int get_dis(int x,int y){
	int steps=0;//定义步数计数器,初始化为0
	while(x!=y){//当两个节点还没有相遇(编号不相同)时,持续循环
		if(x>y)x=get_par(x);//如果x的编号更大,让x向上跳到它的父节点
		else y=get_par(y);//如果y的编号更大(或相等但没相遇的情况已被排除),让y向上跳到它的父节点
		steps++;//每跳一次,路径步数加一
	}
	return steps;//当x和y相遇时,返回累计的总步数
}
int main(){//主函数入口
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>q;//读入询问的组数q
	while(q--){//循环处理每一组询问
		int x,y;//定义变量x和y,表示当前询问的两个节点编号
		cin>>x>>y;//读入这两个节点的编号
		cout<<get_dis(x,y)<<"\n";//调用距离计算函数,输出结果并换行
	}
	return 0;//程序正常结束
}

题目传送门https://www.luogu.com.cn/problem/P13016


前言

我是一名专注信奥赛(CSP-J/S、NOIP)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的优快云账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

核心解题思路

这道题表面上是一个关于树和图论的问题,但由于节点数量高达 10^9,传统的建树和最近公共祖先(LCA)算法(如倍增法)会因为空间和时间复杂度过高而直接崩溃。因此,我们需要深入挖掘这棵特殊树的数学性质,将其转化为一个数论与模拟问题。

  1. 树的特殊构建规则:
    题目规定,节点 k 的父节点是“除 kk 以外最大的因数”。在数论中,一个数的最大真因数等于该数除以它的最小质因数。例如,60 的最小质因数是 2 ,所以它的父节点是 60/2=30 ;15 的最小质因数是 3 ,父节点是 15/3=5 。
  2. 向上跳跃的单调性:
    因为父节点总是等于“原数除以最小质因数”,而最小质因数必定 ≥2 ,所以父节点的值必定严格小于原数。这意味着,沿着父节点向上走,节点的编号是严格单调递减的。
  3. 双指针模拟 LCA:
    既然编号是单调递减的,我们在寻找两个节点 x 和 y 的最近公共祖先(LCA)时,根本不需要复杂的倍增数组。只需要比较 x 和 y 的大小,让较大的那个数不断向上跳跃(寻找父节点),直到 x 和 y 相遇即可。相遇的点必然是它们的 LCA,跳跃的总次数就是它们之间的距离。
  4. 时间复杂度分析:
    • 寻找一个数的最小质因数(即求父节点)的时间复杂度为 O(\sqrt{n}) 。
    • 每次向上跳跃,节点的值至少减半(因为最小质因数 ≥2 ),所以从 109109 走到根节点 1 ,最多只需要跳跃 log⁡2(10^9)≈30 次。
    • 综合来看,单次查询的时间复杂度极低,完美契合 10^9 的数据规模。

代码分块详细解释

1. 头文件与全局变量定义

#include<bits/stdc++.h>
using namespace std;
int q; // 定义全局变量 q,表示询问的组数
  • 详细分析:引入万能头文件以使用 STL 库和数学函数。定义全局变量 q 用于控制后续的循环次数。

2. 核心数论函数:求父节点

// 自定义函数:求节点 x 的父节点(即 x 除以它的最小质因数)
int get_par(int x){
    if(x==1) return 0; // 特判:根节点 1 没有父节点,返回 0 作为终止标志
    for(int i=2; i*i<=x; i++){ // 从 2 开始遍历到 sqrt(x),寻找 x 的最小质因数
        if(x%i==0) return x/i; // 如果 i 能整除 x,说明 i 就是最小质因数。
                               // 根据数论性质,x/i 即为除 x 以外的最大真因数(父节点),直接返回
    }
    return 1; // 如果循环结束都没找到因数,说明 x 本身就是一个质数。
              // 质数的因数只有 1 和自身,所以它的最大真因数必定是 1,直接返回 1
}
  • 详细分析:这是整个算法的基石。代码巧妙地利用了“最大真因数 = 原数 / 最小质因数”这一数学等价转换。通过 O(\sqrt{n})的试除法,我们避免了去枚举所有因数带来的巨大开销。同时,对根节点 1 和质数进行了完美的边界处理,保证了函数的鲁棒性(稳健性)。

3. 距离计算函数:模拟 LCA 过程

// 自定义函数:计算两个节点 x 和 y 在树上的距离
int get_dis(int x, int y){
    int steps = 0; // 定义步数计数器,初始化为 0
    while(x != y){ // 当两个节点还没有相遇(编号不相同)时,持续循环
        if(x > y) x = get_par(x); // 核心贪心策略:如果 x 的编号更大,说明 x 在树上更深,让 x 向上跳到它的父节点
        else y = get_par(y);      // 反之,如果 y 的编号更大,让 y 向上跳
        steps++; // 每发生一次向上跳跃,路径上的边数(步数)加一
    }
    return steps; // 当 x 和 y 相遇时,说明到达了最近公共祖先,返回累计的总步数
}
  • 详细分析:这个函数完美替代了传统 LCA 的复杂模板。由于树的节点编号具有“越往上编号越小”的单调性,if(x > y) 的判断实际上就是在比较两个节点的深度。谁更深,谁就先往上爬。这种“双指针”式的模拟不仅代码极其简洁,而且由于每次跳跃至少使数值减半,循环次数被严格限制在对数级别,绝不会超时。

4. 主函数与 IO 处理

int main(){ // 主函数入口
    ios::sync_with_stdio(false);
    cin.tie(0); // 关闭 C++ 标准流同步,大幅提升大量数据输入输出的效率
    cin >> q; // 读入询问的组数 q
    while(q--){ // 循环处理每一组询问
        int x, y; // 定义变量 x 和 y,表示当前询问的两个节点编号
        cin >> x >> y; // 读入这两个节点的编号
        cout << get_dis(x, y) << "\n"; // 调用距离计算函数,输出结果并换行
    }
    return 0; // 程序正常结束
}
  • 详细分析:主函数逻辑清晰,专注于数据的读取与结果的输出。使用 "\n" 代替 endl 避免了不必要的缓冲区刷新,配合 IO 优化,确保了在 q≤1000的询问下,程序能够以极快的速度响应。

核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
IO 优化ios::sync_with_stdio(false)提升输入输出效率防止在多次循环查询下因 IO 瓶颈导致超时
数论转换for(int i=2; i*i<=x; i++)寻找最小质因数将“求最大真因数”的 O(N) 暴力枚举降维打击至 O(\sqrt{n})
边界处理if(x==1) 与 return 1处理根节点与质数保证向上跳跃逻辑在任何极端数据下都不会死循环或报错
单调性利用if(x > y) x = get_par(x)模拟双指针向上爬树巧妙利用节点编号单调递减的特性,替代复杂的 LCA 倍增算法
步数累加steps++记录路径边数将抽象的树上距离转化为具体的模拟操作次数,直观且高效
深度残差网络的无人机多目标识别 深度残差网络的无人机多目标识别 人工智能技术与咨询 来源:《图学学报》。作者翟进有等 摘要:传统目标识别算法中,经典的区域建议网络(RPN)在提取目标候选区域时计算量大,时间复杂度较高,因此提出一种级联区域建议网络(CRPN)的搜索模式对其进行改善。此外,深层次的卷积神经网络训练中易产生退化现象,而引入残差学习的深度残差网络(ResNet),能够有效抑制该现象。对多种不同深度以及不同参数的网络模型进行研究,将两层残差学习模块与三层残差学习模块结合使用,设计出一种占用内存更小、时间复杂度更低的新型多捷. 阅读详情

相关推荐

【Simscape】用Simscape实现三维物理仿真(三)——创建一个滑块单摆系统

1 首先创建一个Simscape Multibody 模型 (方法见 【Simscape】用Simscape实现三维物理仿真(一)——创建一个自由落体小球) 2 创建四个Solid模块 (1)摆杆 Shape : Brick Dimensions : [0.1 0.05 1] m (2)摆杆轴 Shape : Cylinder Radius : 0.02 m Le...

ReadAir的专栏 9037

洛谷 P13016:[GESP202506 六级] 最大因数

本质是计算两个数通过特定操作达到相同值的最小步骤数。

hnjzsyjyj的专栏 444

雷电模拟器安装面具环境并过软件检测系列(看这一篇就够了!)

雷电模拟器安装面具环境并过基本软件的环境检测

qq_45059975的博客 6万+

《P13016 [GESP202506 六级] 最大因数》

题目摘要:给定一个包含10^9个节点的有根树,节点编号1到10^9,根为1。对于编号k≥2的节点,其父节点是k的最大真因数(即k的最大因数除自身)。现给出q组查询,每组查询两个节点x和y,要求计算它们在树上的距离(路径边数)。 关键点: 树结构:每个节点的父节点是其最大真因数 查询要求:计算任意两个节点间的路径边数 数据范围:q≤1000,节点编号≤10^9 样例说明: 查询(3,1)距离为1 查询(25,4)距离为2 查询(120,650)距离为9 解决方法:需要通过求LCA(最近公共祖先)来计算树上距离

Jasmine_llq的博客 195

prometheus 从入门到精通(史上最全)

Prometheus(由go语言开发)是一套开源的监控&报警&时间序列(按照时间排序)数据库的组合。因为kubernetes(俗称k8s)的流行带动了prometheus的发展。它可以监控主机,服务,容器,支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。原文链接:https://blog.youkuaiyun.com/qq_45277554/article/details/130917620时间序列数据。

流水_鱼鱼的博客 1万+

LDA主题模型简介及Python实现

一、LDA主题模型简介 LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。 LDA主题模型不关心文档中单词的顺序,通常使用词袋特征(bag-of-word feature)来代表文档。词袋模型介绍可以参考这篇文章:文本向量化表示——词袋模型 - 知乎 了解LDA模型,我们需要先了解LDA的生成模型,LDA认为一篇文章是怎么形成的呢? LDA模型认为主题可以由一个词汇...

weixin_41168304的博客 20万+

洛谷 P13016 [GESP202506 六级] 最大因数-普及/提高-

的两个结点在这棵树上的距离。两个结点之间的距离是连接这两个结点的简单路径所包含的边数。将两个数中较大的一个分解掉一个最小的质因数,知道两个数相等。个结点的有根树,这些结点依次以。行,每行一个整数,表示结点。)的结点,其父结点的编号为。编号,根结点的编号为。,请你求出编号分别为。,表示询问结点的编号。对于所有测试点,保证。

weixin_37253733的博客 1120

C#上位机之海康相机开发(SDK)实战教程

SDK的接口设计遵循“句柄-操作-释放”模式,掌握→→→的流程,就能完成基础开发;工业场景需重点关注稳定性:断连重连、内存管理、抗干扰(网口相机的IP设置、触发信号的可靠性);进阶功能(如图像处理、多相机同步)需结合视觉库(EmguCV)和硬件特性(GPIO触发),但前提是保证基础采集的稳定。建议新手先跑通SDK自带的C#示例,理解每个函数的作用,再逐步替换为自己的代码。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2196

打卡信奥刷题(2230)用C++实现信奥 P13016 [GESP202506 六级] 最大因数

题目摘要: 给定一棵具有10^9个节点的有根树,节点编号为1至10^9。对于编号k≥2的节点,其父节点是k的最大真因数。现需要处理q组查询,每组给出两个节点编号x和y,要求计算它们在树上的距离(即路径边数)。 关键点: 树结构特殊,父节点关系由最大因数决定 对于每组查询,需要找到两节点到根的路径并计算最近公共祖先 使用分解因数的方法生成路径,再计算路径长度差 解决方案: 通过分解每个节点的最大因数生成到根的路径,比较两条路径的公共部分,用路径总长度减去公共部分长度得到结果。 样例结果: 输入3组查询(1,3

Loge谈信奥--一个专注于信奥人的博客 396

SRS流媒体服务器在Windows下的安装

在之前的流媒体开发中(视频会议),我基本上使用nginx加模块的方式进行学习、测试,正式开发的时候改为服务器端用EasyDarwin,客户端用rtsp-simple-server(这些流媒体服务器的用法见我以前的博文),这样可以充分利用客户端的资源,降低服务器端的压力。在流媒体协议方案,我选择相对较快的rtsp。这个协议优点是支持UDP协议,优化好的环境下可以实现3秒以下的延迟,基本满足甲方要求,缺点就是不支持网页播放。

dgnankai的专栏 2023

基于OpenClaw的AI数字员工协同团队架构设计

随着大型语言模型从被动的文本生成器向具备自主规划与执行能力的智能代理演进,企业级人工智能的应用范式正在发生根本性转变。在这一演进过程中,OpenClaw(前身为Clawdbot及Moltbot)作为一种开源的、本地优先的个人AI智能体网关基础设施,凭借其对持续内存、多通道接入以及沙盒化工具执行的原生支持,迅速成为构建“始终在线”数字劳动力的核心框架 1。然而,将单体个人助理扩展为能够处理复杂业务逻辑、支持跨组织协同并严格保障数据隔离的多智能体(Multi-Agent)团队,绝非简单的API拼接。系统架构必须

形上得其象,形下合于数;阴阳自济,玄理自明。 1048

【GESP2506六级】学习小组 最大因数

【GESP2506六级】学习小组 最大因数

青少年趣味编程 969

Mamba SSM 实战:IMDb 文本分类 + Mamba-ssm 全流程

Mamba SSM 文本分类链路:IMDb 二分类 → MambaLMHeadModel (d_model=256, n_layer=8, d_state=16, exp2=2) → 末 token 分类头。5 epoch 达 89.2% 准确率 (与 BERT-base 持平), 但显存降低 44% (3.5GB vs 6.2GB)。建议序列长度 ≥ 1024 再选 Mamba, 短序列 (< 512) 用 BERT 更高效。扩展时注意d_state。

m0_71589036的博客 57

CCF-GESP计算机学会等级考试2025年6月六级C++T2 最大因数

题目描述了一棵具有10^9个节点的特殊树结构,其中每个节点k的父节点是k的最大真因数。给定q组询问,每组给出两个节点编号x和y,要求计算它们在树上的距离(边数)。 解题思路是:对于两个节点,不断比较大小,较大的节点向上移动到其父节点(最大真因数),直到两者相遇。每次移动计数一次,最终累计次数即为两节点距离。该算法通过逐步缩小节点间差距来找到共同祖先,从而确定路径长度。 样例输入输出展示了不同节点对的距离计算,包括简单情况(1-3为1)和较复杂情况(120-650为9)。代码实现使用循环比较和因数分解,高效解

长春高老师编程 1591

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

记——那次难忘的GESP六级考试(202603)+编程题题解

本文记录了作者参加GESP六级考试的全过程,重点描述了备考和考试当天的经历。作者详细列出了自己完成的13道编程题目及解题思路,包括DP、贪心、树状数组等算法题,同时也提到未完成的8道题目。考试当天经历了忘带鼠标的意外,利用触控板继续练习。文章还提到选择题涉及动态规划、树遍历等基础知识,整体展现了作者从紧张备考到从容应考的心路历程,以及面对突发状况的应对能力。

2401_84010520的博客 641

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 332

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 311

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 331

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 604

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 147

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 24

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 437

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 425

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 174

算法64,字母异位词分组

代码核心思路是:互为字母异位词的字符串,在对其字符进行排序后,一定会得到相同的字符串。因此,可以将排序后的字符串作为哈希表的键(Key)来进行分组。

sheshibenniaodan的博客 195

【MPC 算法】Python 实战:模型预测控制(MPC)算法原理与代码实现

本文介绍模型预测控制(MPC)原理与Python实现。MPC通过滚动优化预测未来状态,结合系统模型、目标函数与约束条件,动态生成最优控制序列。以一阶温度系统为例,使用CVXPY构建凸优化问题,实现加热功率的智能调控。代码包含模型预测、目标函数设计(含温度跟踪与控制平滑惩罚)、输入约束及滚动更新机制。仿真结果表明,MPC能快速稳定温度至目标值60℃,且控制动作平滑合理,体现其在复杂系统中的优越性。

赖德发的博客 48
上一篇: P13015 [GESP202506 六级] 学习小组
下一篇: P14075 [GESP202509 六级] 划分字符串
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值