HDU5584(lcm&gcd)
2016-05-09 21:13
369 查看
点击打开链接
当x>y时,上一步一定是从左往右走
当y>x时,上一步一定是从下往上走
当x=y时,不存在这样的点
//以y>x为例:设z=k*x(k为整数),gcd(x,y)=gcd(x,y-k*x)=x*(y-k*x)/lcm(x,y-kx)=x*(y-k*x)/z=(y-k*x)/k
可得出k=y/(gcd(x,y)+x),故只要检验y%(gcd(x,y)+x)==0即可
当x>y时,上一步一定是从左往右走
当y>x时,上一步一定是从下往上走
当x=y时,不存在这样的点
//以y>x为例:设z=k*x(k为整数),gcd(x,y)=gcd(x,y-k*x)=x*(y-k*x)/lcm(x,y-kx)=x*(y-k*x)/z=(y-k*x)/k
可得出k=y/(gcd(x,y)+x),故只要检验y%(gcd(x,y)+x)==0即可
#include<cstdio> using namespace std; typedef long long ll; ll gcd(ll m,ll n) { ll r=m%n; while(r) { m=n; n=r; r=m%n; } return n; } int main() { ll T,x,y,ans,cas=1,flag,m; scanf("%lld",&T); while(T--) { scanf("%lld%lld",&x,&y); ans=1; while(x>0&&y>0) { flag=0; if(x>y) { m=gcd(x,y); if(x%(m+y)==0) { ans++; x-=x*y/(m+y); flag=1; } } else if(y>x) { m=gcd(x,y); if(y%(m+x)==0) { ans++; y-=x*y/(m+x); flag=1; } } else break; if(flag==0) break; } printf("Case #%lld: %lld\n",cas++,ans); } return 0; }
相关文章推荐
- 《自控力》读书笔记
- 个人感想之“需求分析”
- Bootstrip 的select的数据绑定问题
- APIO2016 游(gun cu)记
- spring4 4000 +springmvc4+hibernate4集成框架流程:
- JavaScript 检查某元素是否有某属性 elementSupportAttribute(elementName,attribute) JavaScript扩展
- NYOJ 1009 So Easy[Ⅰ]
- 【HTTP指南】杂
- 链表——删除链表中倒数第n个结点(时间复杂度为O (n))
- 并发编程 - Guarded Suspension模式
- duplicate 数据库 from active database [oracle 11.2.0.3 + asm] => [oracle 11.2.0.3 + asm]
- 软件体系结构 UML设计
- XMG Quartz2D 设置裁剪区域
- Spark中文手册4:Spark之基本概念(2)
- C++第五次上机作业
- 用递归写排列组合问题
- 如何在cPanel中创建新MySQL数据库、用户以及设置权限
- LCD1602自定义点阵字符
- JBOSS 6和JBOSS 5搭建多实例方法
- best coder (百度之星) IP聚合