题意:当前的位置为(x, y),设 l = LCM(x, y),下一步可以到达(x+l, y)和(x, y+l)。已知终点的位置,问起点有多少种方案。
题解:若 x<y,那么上一个点必为(x, y′),其中 y=y’+z, z=LCM(x, y’), z=k∗x .易知 GCD(x, y) = GCD(x, y’),由于“两个数的积是这两个数 GCD 和 LCM 的积”得出 x*(y-z) = GCD(x, y)*z,化简得 z=xy/(x+GCD(x, y)).
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; int main(){ //freopen("a.txt", "r", stdin); int T; cin >> T; for(int k = 1; k <= T; k++){ long long a, b; int ans = 1; scanf("%lld %lld", &a, &b); if(a > b) swap(a, b); while(1){ if(a <= 0) break; if( a*b%(a+__gcd(a, b)) != 0) break; long long z = a*b/(a+__gcd(a, b)); if(z > b) break; b -= z; if(z%a != 0 || z%b != 0) break; ans++; if(a > b) swap(a, b); } printf("Case #%d: %dn", k, ans); } return 0; }
比赛时这题没做出来,原因是忘了“两个数的积是这两个数 GCD 和 LCM 的积”。。。:(