HDU 5584 LCM Walk (2015ACM/ICPC亚洲区上海站)

来源:互联网 发布:淘宝店铺卖什么比较好 编辑:程序博客网 时间:2024/05/17 07:36

题目链接

传送门

题意

设当前的位置为(x,y),设l=LCM(x,y),下一步可以到达,(x+l,y),(x,y+l)告诉你终点的位置(x,y),问起点有多少种方案。

分析

如果x<y,那么肯定是由(x,y+z) ,z=LCM(x,y) ,z=kx
t=GCD(x,y)
那么可以推出t=GCD(x,y)

x(yz)=zt

z=xyx+t

注意几个条件

  • x<y
  • zmod(x+t)=0
  • z>=x,z<y
  • zmod(yz)=0
  • x!=y

Code

#include <bits/stdc++.h>using namespace std;int gcd(int a,int b){    if(b) return gcd(b,a%b);    return a;}typedef long long LL;int main(){    int t,cas=1;    scanf("%d",&t);    while(t--){        LL x,y;        scanf("%lld%lld",&x,&y);        int ans = 1;        while(x!=y){            if(x>y) swap(x,y);            int g=gcd(x,y);            LL z = x*y/(x+g);            if(x*y%(x+g)||z<x||z>=y||z%(y-z)||z%x) break;            ans++;            y=y-z;        }        printf("Case #%d: %d\n",cas++,ans);    }    return 0;}
1 0