青蛙的约会 (POJ - 1061)

题目链接: https://vjudge.net/contest/280753#problem/U
题意: 两只青蛙在圆圈上追赶,圆圈我们可以看作是一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。总长L米。现在要你求出它们跳了几次以后才会碰面。
思路: 对于此题我们可以列方程 (x+mt)-(y+nt)=k*L
移项,(n-m)t+kL=x-y,这时我们可以想到此方程类似于ax+by=c的不定方程,这时我们可以用扩展欧几里德求解出一对 (x,y) 的解 ,因为这对解ax+by=1的解,所以真正为x*c/gcd(a,b);接着我们只需使得x不断减去b/d ( d为gcd(a,b) ),使得x大于0的同时最小,这时的x就是所求
由此式可知a(x-b/d)+b(y+a/d)=c b/d为每次减下的最小单位

#include
#include
#include
#include
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return a;
    }
    ll r=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return r;
}
int main()
{
    ll x,y,m,n,l;
    cin>>x>>y>>m>>n>>l;
    ll a=n-m,b=l,c=x-y;
    ll d=exgcd(a,b,x,y);
    if(c%d)
        cout<<"Impossible"<<endl;
    else {
        x=x*c/d;
        ll t=x*d/b;
        x=x-t*b/d;
        if(x<0)
            x+=b/d;
        cout<<x<<endl;
    }
    return 0;
}

你可能感兴趣的:(数论)