P13016 [GESP202506 六级] 最大因数
题目描述
给定一棵有 10910^9109 个结点的有根树,这些结点依次以 1,2,…,1091, 2, \dots, 10^91,2,…,109 编号,根结点的编号为 111。对于编号为 kkk(2≤k≤1092 \leq k \leq 10^92≤k≤109)的结点,其父结点的编号为 kkk 的因数中除 kkk 以外最大的因数。
现在有 qqq 组询问,第 iii(1≤i≤q1 \leq i \leq q1≤i≤q)组询问给定 xi,yix_i, y_ixi,yi,请你求出编号分别为 xi,yix_i, y_ixi,yi 的两个结点在这棵树上的距离。两个结点之间的距离是连接这两个结点的简单路径所包含的边数。
输入格式
第一行,一个正整数 qqq,表示询问组数。
接下来 qqq 行,每行两个正整数 xi,yix_i, y_ixi,yi,表示询问结点的编号。
输出格式
输出共 qqq 行,每行一个整数,表示结点 xi,yix_i, y_ixi,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≤xi,yi≤10001 \leq x_i, y_i \leq 10001≤xi,yi≤1000。
对于所有测试点,保证 1≤q≤10001 \leq q \leq 10001≤q≤1000,1≤xi,yi≤1091 \leq x_i, y_i \leq 10^91≤xi,yi≤109。
C++实现
#include<bits/stdc++.h>
using namespace std;
int t,x,y;
int f(int x){//寻找最大因数
if (x == 1) return 0;
if (x % 2 == 0) return x / 2;
for (int i = 3;i * i <= x;i += 2)
if (x % i == 0)
return x / i;
return 1;
}
vector<int> check(int x){//生成路径
vector<int> s;
while (x != 0) s.push_back(x),x = f(x);
return s;
}
int clec(int x,int y){//计算距离
vector<int> a = check(x),b = check(y);
int i = a.size() - 1,j = b.size() - 1;
while (i >= 0 && j >= 0 && a[i] == b[j])
i--,j--;
return i + j + 2;
}
int main(){
scanf("%d",&t);
while (t--)
scanf("%d%d",&x,&y),printf("%d\n",clec(x,y));
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P13016 GESP202506 六级 最大因数&spm=1001.2101.3001.5002&articleId=153310046&d=1&t=3&u=7238fec259b64eabb74450d715b7b80c)
434

被折叠的 条评论
为什么被折叠?



