题意:
给出ex,ey终点,询问起点有多少种情况。 如果当前在x,y, 则下一步可以走到x+ lcm(x,y) ,y 或者是 x , y+ lcm(x,y)
思路:
对于每个点 (x,y) 如果他是前一步走过来的,那必定是 x,y的较大者 在前一步加上了lcm 。那么如何知道我们前一步加的是多少?
假设gcd(x,y) = k 那么 x= nk, y= mk, 则lcm(x,y) =nmk,下一步必定是可以走到x+lcm ,y 或者是x, y+lcm ,又因为n 与m*(n+1)互质, m与n*(m+1)互质所以
下一步的gcd仍然为 k 不会改变。
这样很容易列出公式 y= x*y /(gcd(x,y) +x);
#include<cstdio>
#include<map>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
ll x, y;
int main(){
int T;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++){
int ans = 1;
scanf("%lld%lld", &x, &y);
if(x > y) swap(x, y);
while(x * y % (__gcd(x, y) + x) == 0){
ll p = x * y / (__gcd(x, y) + x);
if(__gcd(x, y-p) != __gcd(x, y)) break;
y -= p;
if(x > y) swap(x, y);
ans++;
}
printf("Case #%d: %d\n", kase, ans);
}
return 0;
}