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

题目背景

对应的选择、判断题:试题 - GESP 202506 C++ 六级 - 洛谷有题

题目描述

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

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1复制

复制代码
3
1 3
2 5
4 8

输出 #1复制

复制代码
1
2
1

输入 #2复制

复制代码
1
120 650

输出 #2复制

复制代码
9

说明/提示

对于 60% 的测试点,保证 1≤xi​,yi​≤1000。

对于所有测试点,保证 1≤q≤1000,1≤xi​,yi​≤109。

代码实现:

cpp 复制代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

ll min_factor(ll n)
{
    if(n%2 ==0) return 2;
    for(ll i=3;i*i<=n;i+=2)
    {
        if(n%i == 0) return i;
    }
    return n; 
}

ll get_fa(ll x)
{
    ll p = min_factor(x);
    return x / p;
}

int get_depth(ll x)
{
    int d = 0;
    while(x != 1)
    {
        x = get_fa(x);
        d++;
    }
    return d;
}

ll jump(ll a, int k)
{
    while(k--)
    {
        a = get_fa(a);
    }
    return a;
}

ll lca(ll x, ll y)
{
    int dx = get_depth(x);
    int dy = get_depth(y);
    if(dx > dy)
    {
        x = jump(x, dx - dy);
    }
    else
    {
        y = jump(y, dy - dx);
    }
    if(x == y) return x;
    while(true)
    {
        x = get_fa(x);
        y = get_fa(y);
        if(x == y) return x;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int q;
    cin >> q;
    while(q--)
    {
        ll x,y;
        cin >> x >> y;
        int dx = get_depth(x);
        int dy = get_depth(y);
        ll ancestor = lca(x,y);
        int dlca = get_depth(ancestor);
        int ans = dx + dy - 2 * dlca;
        cout << ans << '\n';
    }
    return 0;
}
相关推荐
飞Link6 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
一去不复返的通信er9 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法
Shaoshing9 小时前
LeetCode100 49. 字母异位词分组
java·算法
YFJ_mily9 小时前
第二届区块链技术与基础模型国际学术会议(BTFM2027)
算法·区块链·能源·智能系统·rdlink研发家·机器人自动化
汤姆宝库10 小时前
收官深拆:第一性原理、产业电网与未来推演
大数据·人工智能·算法
moshuying12 小时前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王12 小时前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
INGNIGHT13 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying13 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法