专栏文章

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

P14079题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@minqwon9
此快照首次捕获于
2025/12/02 06:53
3 个月前
此快照最后确认于
2025/12/02 06:53
3 个月前
查看原文
这题一看就是要 O(loga)O ( \log{a} ) 以内出结果的题 !!!别问我怎么知道的)
本题就是说对于两个数 aabb, 若 gcd(a,b)=1 gcd(a, b) = 1 , 则连一条边权为 pp 的边, 否则连一条边权为 qq 的边。 问 aabb 的最短路。
我们分两种情况讨论:
  1. gcd(a,b)=1 gcd(a, b) = 1 时,ansans 可以等于 pp ,也可以等于 2×q2 \times q, 因为可以先从点 aa 到点 a×ba \times b, 再从点 a×ba \times b 到点 bb
  2. gcd(a,b)>1 gcd(a, b) > 1 时,ansans 可以等于 qq ,也可以等于 2×p2 \times p, 因为可以先从点 aa 到点 11, 再从点 11 到点 bb
但是还要特判一下 !!!
a=ba = b 时, ans=0ans = 0
a=1a = 1b=1b = 1 时, ans=pans = p
以上就是正解思路了。
时间复杂度 O(nloga) O ( n \log{a} ) , 可以通过本题。
空间复杂度 O(1) O ( 1 ) , 包可以通过本题的。
最后, 你们最爱的代码来了 !!!
CPP
#include <bits/stdc++.h>
using namespace std;
#define LL long long
int n;
LL ans, p, q, a, b, g;
int main() {
	scanf("%d%lld%lld", &n, &p, &q);
	while(n --) {
		ans = 1e18;
		scanf("%lld%lld", &a, &b);
		if(a == b) {
			puts("0");
			continue;
		}
		if(a == 1 || b == 1) {
			printf("%lld\n", p);
			continue;
		}
		g = __gcd(a, b);
		if(g == 1) ans = min(p, q * 2);
		else ans = min(q, p * 2);
		printf("%lld\n", ans);
	}
	return 0;
} 
代码很简单, 按上面的思路做就行。

评论

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

正在加载评论...