题解:P13016 [GESP202506 六级] 最大因数
noiiloveyou · · 题解
知识点
GESP 五级:因数(初等数论)。
GESP 六级:树(树的定义,构造与遍历)。
题目分析
注意:本文所说的最大因数不包含此数,最小因数不包含
题意很容易理解,简单地说,就是把
问题 1:如何快速找到一个数(用 n 表示)的最大因数?
很简单,先找到
问题 2:应当先找 x 还是 y 的最大因数?
由于我们的目标是在一番操作后,
代码实现
#include<bits/stdc++.h>
using namespace std;
int q;
int main(){
cin>>q;
int x,y;
for(int i=0;i<q;++i){
cin>>x>>y;
int xmax=2,ymax=2,ans=0;
//分别表示目前找到 x 的最小因数,y 的最小因数和答案
//一直执行,直到 x 等于 y
while(x!=y){
//x 较大
if(x>y){
//找最小因数
while(x%xmax!=0){
//若最小因数超过 sqrt(x),直接断定
if(xmax>sqrt(x)){
xmax=x;
break;
}
//否则,尝试下一个数
++xmax;
}
//得到 x 的最大因数
x/=xmax;
++ans;
}
//y 较大,与上类似
else{
while(y%ymax!=0){
if(ymax>sqrt(y)){
ymax=y;
break;
}
++ymax;
}
y/=ymax;
++ans;
}
}
cout<<ans<<endl;
}
return 0;
}