P9484 「LAOI-1」GCD 题解

· · 题解

前言

赛时 5min 切了,然后就没继续比赛了。

这题目其实就是纯白给签到题然而我第一次提交被卡了输入

解法

考虑条件 \gcd(i,j)=i,\operatorname{lcm} (i,j)=j ,显然等价于 i|j,也就是说当一个数为一个数的倍数时,两个数之间有边。

然后考虑如何最小化路径。

感性上理解是把 xy 都跳到 \gcd(x,y) 处,那么如何证明?

(不妨设 y\le x

考虑把 xy 走,那么 x 一定要先到达一个 y 的因数/倍数 z

情况一:倍数

x 加倍后至少走了 x\ge \gcd(x,y) 步,所以一定不比往 \gcd(x,y) 走优。

情况二:因数

$z$ 比 $\gcd(x,y)$ 大的话 $z$ 中一定有 $y$ 不需要的因子,最终还要除去,而 $x$ 已经加倍过,出去后走的就要比原来远,故也不如直接走到 $\gcd(x,y)$ 优。 综上,答案为 $x+y-2\gcd(x,y)$。 ## Code ```cpp #include<bits/stdc++.h> int t,n,q; int x,y; int gcd(int a,int b) { while(b^=a^=b^=a%=b); return a; } using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>t; while(t--) { cin>>n>>q; for(int i=1;i<=q;i++) { cin>>x>>y; cout<<x+y-2*gcd(x,y)<<'\n'; } } return 0; } ```