《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;
}
相关推荐
醇氧10 小时前
MySQL 8.0 系统表损坏与引擎转换故障排查实战
数据结构·算法
大熊背11 小时前
《Color constancy by characterization of illumination chromaticity》之色度色域最大化算法(二)
算法·白平衡·色度·色温
钓鱼的肝11 小时前
梳理(1-5)
c++·经验分享·笔记·算法·青少年编程
HZZD_HZZD11 小时前
CSDN_批发市场水电漏损归因算法LAM的原理与落地
嵌入式硬件·物联网·算法
shirsl13 小时前
算法 Day 5 树 / 二叉树 + DFS
数据结构·python·算法
木子算法14 小时前
非凸、离散、还耦合:论文里的求解方法是一条四步流水线
人工智能·算法·目标跟踪
虚无的纽扣14 小时前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
多弗朗皮卡丘14 小时前
数据结构9:排序算法
c语言·数据结构·排序算法
张祥64228890414 小时前
牛顿迭代法求解开普勒方程:从RTKLIB源码到数值分析
人工智能·算法·机器学习
Niuguangshuo14 小时前
论文解读:Deep Speech 2,工业级英中端到端 ASR 系统报告
算法·音视频·语音识别