#扩欧#洛谷 1516 poj 1061 青蛙的约会

题目

规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。求它们跳了几次以后才会碰面。


分析

简单的,得到

x + m k y + n k ( m o d     l )

移项后

k m k n y x ( m o d     l )

然后mod l改为

k m k n = y x + l z ( z Z )

再移项

k ( m n ) l z = y x

很像了,各取相反数。

k ( n m ) + l z = x y

设A为n-m,B为x-y
那么

k A + l z = B

扩欧
求出A和z后还要求最小的,所以要除以最大公约数,
then


代码

#include <cstdio>
using namespace std;
typedef long long ll;
ll d,x,y,m,n,l,a,b,X,Y;
void exgcd(ll a,ll b,ll &X,ll &Y){
    if (!b) X=1,Y=0,d=a;
    else exgcd(b,a%b,Y,X),Y-=a/b*X;
}
int main(){
    scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
    a=n-m; b=x-y;
    if (a<0) a=-a,b=-b;//非负整数
    exgcd(a,l,X,Y);//扩欧
    if (b%d) puts("Impossible");//不可能
    else{
        int k=l/d;//除以最大公约数
        printf("%lld",((X*b/d)%k+k)%k);//求出答案
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/80758289