• L


    题目链接:

    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
    ",ans);
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    操作数据库帮助类
    VS快捷键收藏
    sqlserver 定时任务
    LayUI相关
    java20140407
    java20140406
    java20140405
    获取一个字符串在整个字符串中出现的次数
    System类
    java中的集合Collection
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10715434.html
Copyright © 2020-2023  润新知