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

题目描述

给定一棵有 1 0 9 10^9 109 个结点的有根树,这些结点依次以 1 , 2 , … , 1 0 9 1, 2, \dots, 10^9 1,2,,109 编号,根结点的编号为 1 1 1。对于编号为 k k k 2 ≤ k ≤ 1 0 9 2 \leq k \leq 10^9 2k109)的结点,其父结点的编号为 k k k 的因数中除 k k k 以外最大的因数。

现在有 q q q 组询问,第 i i i 1 ≤ i ≤ q 1 \leq i \leq q 1iq)组询问给定 x i , y i x_i, y_i xi,yi,请你求出编号分别为 x i , y i x_i, y_i xi,yi 的两个结点在这棵树上的距离。两个结点之间的距离是连接这两个结点的简单路径所包含的边数。

输入格式

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

接下来 q q q 行,每行两个正整数 x i , y i x_i, y_i xi,yi,表示询问结点的编号。

输出格式

输出共 q q q 行,每行一个整数,表示结点 x i , y i x_i, y_i xi,yi 之间的距离。

输入输出样例 #1

输入 #1

3
1 3
2 5
4 8

输出 #1

1
2
1

输入输出样例 #2

输入 #2

1
120 650

输出 #2

9

说明/提示

对于 60 % 60\% 60% 的测试点,保证 1 ≤ x i , y i ≤ 1000 1 \leq x_i, y_i \leq 1000 1xi,yi1000

对于所有测试点,保证 1 ≤ q ≤ 1000 1 \leq q \leq 1000 1q1000 1 ≤ x i , y i ≤ 1 0 9 1 \leq x_i, y_i \leq 10^9 1xi,yi109

solution

将两个数中较大的一个分解掉一个最小的质因数,知道两个数相等

代码

#include 
#include "bit"
#include "vector"
#include "unordered_set"
#include "unordered_map"
#include "set"
#include "queue"
#include "algorithm"
#include "bitset"
#include "cstring"
#include "cmath"

using namespace std;

int n, x, y;

int main() {
    cin >> n;
    while (n--) {
        cin >> x >> y;
        int c = 0;
        while (true) {
            if (x == y) {
                cout << c << endl;
                break;
            }
            if (x < y) swap(x, y);

            int i = 2;
            for (; i * i <= x; i++) {
                if (x % i == 0) {
                    break;
                }
            }
            if (i * i > x) {
                x = 1;
            } else {
                x /= i;
            }
            c++;
        }
    }
}

结果

洛谷 P13016 [GESP202506 六级] 最大因数-普及/提高-_第1张图片

你可能感兴趣的:(洛谷,算法,数据结构,洛谷,c++)