返回首页 返回题库

最大因数

C++ 中等 GESP六级真题 #数论#树结构#最近公共祖先#因数分解

题目描述

题面描述

给定一棵有 个结点的有根树,这些结点依次以 编号,根结点的编号为 。对于编号为 ()的结点,其父结点的编号为 的因数中除 以外最大的因数。

现在有 组询问,第 ()组询问给定 ,请你求出编号分别为 的两个结点在这棵树上的距离。两个结点之间的距离是连接这两个结点的简单路径所包含的边数。

输入格式

第一行,一个正整数 ,表示询问组数。

接下来 行,每行两个正整数 ,表示询问结点的编号。

输出格式

输出共 行,每行一个整数,表示结点 之间的距离。

样例1

输入:

3
1 3
2 5
4 8

输出:

1
2
1

样例2

输入:

1
120 650

输出:

9

数据范围

对于 的测试点,保证 。

对于所有测试点,保证 ,。

时间与内存限制

时间限制:1.0 s

内存限制:512.0 MB

💡 查看提示(先自己想一想再看)
本题考察数论与树结构的结合应用。每个结点的父结点是其除自身外的最大因数,等价于结点到根的路径是该数不断除以其最小质因数的过程。两个结点的距离可以转化为各自到根的深度之和减去两倍的最近公共祖先的深度,通过生成两个结点到根的路径,从大到小匹配第一个公共结点即可计算距离。需要注意大数的质因数分解效率,遍历到平方根即可完成分解。
⚙ 开始做这道题 0 人做过 · 0 收藏 · 2 浏览

讨论(0)