1 条题解

  • 0
    @ 2025-8-24 23:05:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar cff_0102
    & aqua_qaq | 团子群 185800038 | 如果我死了说明我 AFO 了

    搬运于2025-08-24 23:05:59,当前版本为作者最后更新于2024-11-15 08:48:16,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    x=yx=y 时,直接输出 00 即可。

    由于两个数之间的连边长度为它们的最小公倍数,而 aabb 的最小公倍数必然大于等于 aabb,所以要从 xx 走到 yy,中间经过的最大的边必然大于等于 xxyy

    xxyy 存在倍数关系,那么它们之间就连了一条长为 max(x,y)\max{(x,y)} 的边,根据之前的推理,直接走这条边显然是最优的,因为不可能存在长度小于它的路径了。

    如果 xxyy 不存在倍数关系,那么有两种可行的做法:

    1. 直接从 xx 走到 yy
    2. xx 出发,经过若干个“中转点”,再走到 yy

    前者的路径长度为 lcm(x,y)\operatorname{lcm}(x,y)。至于后者,考虑走的第一条和最后一条边,它们的长度必然分别大于等于 xxyy,所以最终路径的长度不可能小于 x+yx+y。而从 xx 走到 11,再从 11 走到 yy 的做法的最终路径长度恰好即为 x+yx+y,因此这样做的最短路径长度为 x+yx+y

    x,yx,y 不存在倍数关系时,lcm(x,y)2×max(x,y)>x+y\operatorname{lcm}(x,y)\ge2\times\max(x,y)>x+y,因此 x+yx+y 是更优的答案。此时输出 x+yx+y 即可。

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    signed main(){
    	ios::sync_with_stdio(0);cin.tie(0);
    	int t;cin>>t;while(t--){
    		int x,y;cin>>x>>y;
    		int a=__gcd(x,y);
    		if(x==y)cout<<0<<endl;
    		else if(a==x)cout<<y<<endl;
    		else if(a==y)cout<<x<<endl;
    		else cout<<x+y<<endl;
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    10912
    时间
    2000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者