题解:P14079 [GESP202509 八级] 最短距离
这题一看就是要 别问我怎么知道的)。
本题就是说对于两个数
我们分两种情况讨论:
-
当
gcd(a, b) = 1 时,ans 可以等于p ,也可以等于2 \times q , 因为可以先从点a 到点a \times b , 再从点a \times b 到点b 。 -
当
gcd(a, b) > 1 时,ans 可以等于q ,也可以等于2 \times p , 因为可以先从点a 到点1 , 再从点1 到点b 。
但是还要特判一下 !!!
当
当
以上就是正解思路了。
时间复杂度
空间复杂度
最后, 你们最爱的代码来了 !!!
#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;
}
代码很简单, 按上面的思路做就行。