题目链接:
L - LCM Walk
题目大意:首先是T组测试样例,然后给你x和y,这个指的是终点。然后问你有多少个起点能走到这个x和y。每一次走的规则是(m1,m2)到(m1+lcm(m1,m2),m2)或者(m1,m2+lcm(m1,m2))。
具体思路:
lcm(m1,m2)=m1*m2/(gcd(m1,m2)).然后m1就能表示成t1*gcd(m1,m2),m2能表示成t2*gcd(m1,m2)。然后(m1,m2)就能走到(t1*gcd(m1,m2),t2*gcd(m1 , m2)+t
1*t2*gcd(m1,m2)).我们就每次判断m2能不能整除t2*(gcd(m1,m2)+t1*gcd(m1,m2))就可以了。
这个过程gcd(m1,m2)是保持不变的。因为t1和t2是互素的,然后t1和t1+1是互素的,然后t1和(t1+1)*t2也是互素的。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 2e5+100; 6 int main() 7 { 8 int T,Case=0; 9 scanf("%d",&T); 10 while(T--) 11 { 12 int x,y; 13 scanf("%d %d",&x,&y); 14 printf("Case #%d: ",++Case); 15 int tmp=__gcd(x,y); 16 if(x>y) 17 swap(x,y); 18 int ans=1; 19 while(y%(tmp+x)==0) 20 { 21 ans++; 22 y=y/(tmp+x)*tmp; 23 if(x>y) 24 swap(x,y); 25 } 26 printf("%d\n",ans); 27 } 28 return 0; 29 }