码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5584 LCM Walk

时间:2018-10-20 23:42:54      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:应该   color   oid   nbsp   --   void   一个   print   code   

  没用运用好式子。。。想想其实很简单,首先应该分析,由于每次加一个LCM是大于等于其中任何一个数的,那么我LCM加在哪个数上面,那个数就是会变成大的,这样想,我们就知道,每个(x,y)对应就一种情况。

  第二个突破口是,那个式子,我们可以想一想,是不是可以把数进行拆分,我们发现

     a=x*k,b=y*k;其中k=gcd(a,b) 并且 x和y互质,这样带入式子,这样我们就把(x*k,y*k)推到了(x*k,x*y+x*y*k),化简即k *(x,(x+1)*y),gcd仍然是k,反过来,我们只需要保证,前一步,大的值满足(b>a)  b%(a+1)==0 并且 gcd(a,b)=K。不断迭代过程即可 

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
int cnt;
int gcd(int x,int y){
  return x%y==0?y:gcd(y,x%y);
}
void solve(int x,int y){
  if (x>y){
    swap(x,y);
  }
  if (y%(x+1)){
    return ;
  }else {
    cnt++;
    solve(x,y/(x+1));
  }

}
int main(){
  int t;
  int ex,ey;
  scanf("%d",&t);
  int z=0;
  while(t--){
    z++;
    cnt=1;
    scanf("%d%d",&ex,&ey);
    int x=max(ex,ey);
    int y=min(ex,ey);
    int k=gcd(ex,ey);
    x/=k;y/=k;
    solve(x,y);
    printf("Case #%d: %d\n",z,cnt);
  }
  return 0;
}

 

hdu 5584 LCM Walk

标签:应该   color   oid   nbsp   --   void   一个   print   code   

原文地址:https://www.cnblogs.com/bluefly-hrbust/p/9823329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!