L - LCM Walk HDU - 5584 (数论)

题目链接:

L - LCM Walk

 HDU - 5584 

题目大意:首先是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 }

 

posted @ 2019-04-16 10:37  Let_Life_Stop  阅读(176)  评论(0编辑  收藏  举报