这道题的意思是给一个人初始点的坐标为sx, sy, 他可能会走到下一点(sx+z, sy)或者(sx, sy+z)其中z = lcm(sx, sy), 现在给你终点坐标让你推出这个人可能之前走过的点的个数, 首先我们可以肯定的是对于终点坐标ex, ey,中的较小的一个肯定是上一个坐标里面的点, 假设现在在(x, y),x = pt, y=qt, (p, q)=1, 那么下一个点可能是(pt, qt+pqt), (pt+pqt, qt), 根据这个我们就可以逆推回去。。 代码如下:
#include <bits/stdc++.h> using namespace std; int gcd(int a, int b) { if(b==0) return a; else return gcd(b, a%b); } int main() { int T; scanf("%d", &T); int kase = 0; while(T--) { int x, y; scanf("%d%d", &x, &y); if(x>y) swap(x, y); int res = 1; int g = gcd(x, y); while(y%(x+g)==0) { y = y/(x+g)*g; if(x>y) swap(x, y); res++; } printf("Case #%d: %d ", ++kase, res); } return 0; }