题目链接
对于给出的点(x,y) 假设gcd(x,y)=g; 那么x = pg,y = qg(p与q肯定是互质的)他们的LCM=pqg, 这样(x,y)就可以表示为(pg,qg),比如向上走一步 的话,就是(pg+pqg,qg)—>(pg(1+q),qg)—>约掉g—>(p(1+q), q)也就是坐标的大的一个是可以整除坐标小的一个加一的。满足这个条件就是存在前驱节点
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define cl(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define gcd __gcd
const int maxn = 100005;
const int inf = 1<<28;
const LL mod = 1000000007;
LL ans;
void dfs(LL x,LL y){
if(x<y)swap(x,y);
ans++;
if(x%(y+1)==0)dfs(x/(y+1),y);
}
int main(){
int T;scanf("%d",&T);
int cas=1;
while(T--){
LL x,y;scanf("%lld%lld",&x,&y);
ans=0;
LL g=gcd(x,y);
x/=g;y/=g;
dfs(x,y);
printf("Case #%d: %lld\n",cas++,ans);
}
return 0;
}