专栏文章

题解:P14079 [GESP202509 八级] 最短距离

P14079题解参与者 8已保存评论 13

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
13 条
当前快照
1 份
快照标识符
@minqyqdx
此快照首次捕获于
2025/12/02 06:55
3 个月前
此快照最后确认于
2025/12/02 06:55
3 个月前
查看原文

Update

  • 修改一处笔误(错误),删除最开头的话。

Solution

首先我们记录 g=gcd(a,b)g = \gcd(a ,b)
观察到 1a,b1091\le a ,b\le 10^9,但是 N=1018N = 10^{18},一开始我很奇怪。
然后我们思考,对于一条边的情况,我们先记当前答案为 ansans
  • g=1g = 1ans=pans = p
  • g1g\neq 1ans=qans = q
然后我们考虑多条边的情况。
如果 g=1g = 1,我们有:
  • kklcm(a,b)lcm(a,b) 的倍数,那么代价为 cost(a,k)+cost(b,k)=2qcost(a ,k) + cost(b,k) = 2q
  • aka\mid kb∤ kb\not| \ k,代价为 p+qp + q,明显高于 pp
  • a∤ ka\not | \ kbkb\mid k 同理,代价为 p+qp + q
  • a∤ ka\not |\ kb∤ kb\not | \ k,那么代价为 2p2p,明显不如 pp
  • 显然取三个点及以上时,代价都比 2q2q 或者 pp 高。
  • 因此答案为 min{p,2q}\min\{p ,2q\}
如果 g1g \neq 1,则有:
  • kklcm(a,b)lcm(a,b) 的倍数,那么代价为 cost(a,k)+cost(b,k)=2qcost(a ,k) + cost(b,k) = 2q,明显代价高于 qq
  • aka\mid kb∤ kb\not| \ k,代价为 p+qp + q,明显高于 qq
  • a∤ ka\not | \ kbkb\mid k 同理,代价为 p+qp + q
  • a∤ ka\not |\ kb∤ kb\not | \ k,那么代价为 2p2p
  • 显然取三个点及以上时,代价都比 2p2p 或者 qq 高。
  • 因此答案为 min{q,2p}\min\{q ,2p\}
这两种情况是类似的哦。
然后有一些特殊情况:
  • a=ba = bans=0ans = 0
  • min{a,b}=1\min\{a ,b\} = 1,不能按照上面的讨论,举个例子很显然,然后我们发现任意一种代价都高于 pp,因此 ans=pans = p(留给读者自己分类讨论)。
实现CPP
namespace lolcrying {

    inline int gcd(int n ,int m) {return !m ? n : gcd(m ,n % m) ; }
    
    signed main () {
		
        int n = read() ,m = read() ,ans = 0;
        int g = gcd(n ,m);

//就是个分类讨论。

        if(n == m) ans = 0;
        else if(min(n ,m) == 1) ans = p;
        else if(g == 1) ans = min(2 * q ,p);
        else ans = min(2 * p ,q);

        writeln(ans);
        
		return 0;
	}
}

评论

13 条评论,欢迎与作者交流。

正在加载评论...