hdu 5584 LCM Walk
Posted bluefly-hrbust
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5584 LCM Walk相关的知识,希望对你有一定的参考价值。
没用运用好式子。。。想想其实很简单,首先应该分析,由于每次加一个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 ",z,cnt); } return 0; }
以上是关于hdu 5584 LCM Walk的主要内容,如果未能解决你的问题,请参考以下文章