给出一个终点坐标
(
s
x
,
s
y
)
(sx,sy)
(sx,sy),
s
x
≤
1
e
9
,
s
y
≤
1
e
9
sx\leq1e9,sy\leq1e9
sx≤1e9,sy≤1e9,然后规定你可以从一点
(
x
,
y
)
(x,y)
(x,y)出发,每次可以走
(
x
+
l
c
m
(
x
,
y
)
,
y
)
(x+lcm(x,y),y)
(x+lcm(x,y),y)或者
(
x
,
y
+
l
c
m
(
x
,
y
)
)
(x,y+lcm(x,y))
(x,y+lcm(x,y))两种路径,可以走
0
0
0次到若干次,求问所有合法的起点有多少个。
对于
(
x
,
y
)
(x,y)
(x,y)->
(
x
+
l
c
m
(
x
,
y
)
,
y
)
(x+lcm(x,y),y)
(x+lcm(x,y),y),不妨设
g
=
g
c
d
(
x
,
y
)
g=gcd(x,y)
g=gcd(x,y),即
(
g
x
′
,
g
y
′
)
(gx',gy')
(gx′,gy′)->
(
g
x
′
+
g
x
′
y
′
,
g
y
′
)
(gx'+gx'y',gy')
(gx′+gx′y′,gy′),显然
g
x
′
+
g
x
′
y
′
>
g
y
′
gx'+gx'y'>gy'
gx′+gx′y′>gy′,所以上一步一定是走到当前较大的这个。
而
g
x
′
+
g
x
′
y
′
=
x
′
(
g
+
g
y
′
)
gx'+gx'y'=x'(g+gy')
gx′+gx′y′=x′(g+gy′),然后利用当前的逆推求出所有的解。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
int gcd(int x,int y) {
if(y==0) return x;
else return gcd(y,x%y);
}
int main() {
int T,kase=0;
scanf("%d",&T);
while(T--) {
int a,b,ans=1;
scanf("%d%d",&a,&b);
while(1) {
if(a<b) swap(a,b);
int g=gcd(a,b);
if(a%(g+b)) break;
a=a/(g+b)*g;
++ans;
}
printf("Case #%d: %d\n",++kase,ans);
}
return 0;
}