构造题。
来看这个东东:如果
h
k
≤
b
<
h
k
+
1
h^k\leq b< h^{k+1}
hk≤b<hk+1 , 那么
R
(
b
,
h
)
=
h
R(b, h) = h
R(b,h)=h 。
构造这个东东:
b
=
g
⌈
h
k
g
⌉
a
=
h
b
+
g
b=g\lceil\frac{h^k}{g}\rceil \\ a=hb+g
b=g⌈ghk⌉a=hb+g
其中 k k k 是 满足 h k > g h^k>g hk>g 的最小正整数。我们知道 g < h k ≤ b ≤ g ( h k g + 1 ) = h k + g < h k + 1 g<h^k\leq b\leq g(\frac{h^k}{g}+1)=h^k+g<h^{k+1} g<hk≤b≤g(ghk+1)=hk+g<hk+1 ( h ≥ 2 ) (h\geq 2) (h≥2) 。
我们有:
- g c d ( a , b ) = g c d ( h b + g , b ) = g c d ( g , b ) = g gcd(a,b)=gcd(hb+g,b)=gcd(g,b)=g gcd(a,b)=gcd(hb+g,b)=gcd(g,b)=g 。
- R ( a , b ) = R ( h b + g , b ) = R ( h , b ) = R ( b , h ) = h R(a,b)=R(hb+g,b)=R(h,b)=R(b,h)=h R(a,b)=R(hb+g,b)=R(h,b)=R(b,h)=h
根据 h k ≤ b < h k + 1 h^k\leq b< h^{k+1} hk≤b<hk+1 ,所以在经过 k k k 次后会成为 1 1 1 。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll g,h;
int main() {
int T; scanf("%d",&T);
while(T--) {
scanf("%d%d",&g,&h);
ll mul=h; while(mul<=g) mul*=h;
ll a,b;
printf("%lld %lld\n",a=h*b+g,b=((mul-1)/g+1)*g);
}
}