LCM Walk
.
.
假设 x = p * k , y = q * k ( k = gcd(x,y) ) 那么 z = p*q*k. 下一步会跳到( k * p * (1+q) , q * k ) 或者 ( p * k , k * q * ( 1 + p ) ),然后发现他们的gcd值并没有改变,所以推出无论跳多少步,gcd值永远不会改变。所以除去gcd的值后,每次都是 较大值/(较小值+1),一直推就好了
.
.
#include <bits/stdc++.h>
using namespace std;
int main() {
int t, x, y, ca = 0;
scanf("%d", &t);
while (t--) {
scanf("%d %d", &x, &y);
int ans = 1;
if (x > y) {
int tmp = x; x = y; y = tmp;
}
while (1) {
int ll = __gcd(x, y), tt = x / __gcd(x, y) + 1;
if (y % tt > 0) {
break;
}
int tx = x;
x = y / tt; y = tx;
if (__gcd(x, y) != ll) {
break;
}
if (x > y) {
int xx = x; x = y; y = xx;
}
ans++;
}
printf("Case #%d: %d\n", ++ca, ans);
}
}