POJ - 1061 青蛙的約會 (擴展歐幾里得找最小正整數解)

題意:兩隻青蛙在圓圈上追趕,圓圈我們可以看作是一條首尾相接的數軸。設青蛙A的出發點座標是x,青蛙B的出發點座標是y。青蛙A一次能跳m米,青蛙B一次能跳n米,兩隻青蛙跳一次所花費的時間相同。總長L米。現在要你求出它們跳了幾次以後纔會碰面。

思路:設跳了t次以後纔會碰面,則有(x + tm) % L = (y + tn) % L,即 (x + tm) - (y + tn) = PL,整理得:(n - m) * t + PL = x - y,即ax + by = c的形式,我們用擴展歐幾里得函數求解,得到ax + by = gcd(a,b)的解(x0,y0),如果c能整除gcd(a,b)則表明該方程有解,x1 = (x0 * c  /  (gcd(a,b)),最小正整數解爲(x1 % (b / gcd(a,b) + b / gcd(a,b)) % (b / gcd(a,b))。

 

#include <stdio.h>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll& x,ll& y)
{
    ll d = a;
    if(b != 0) {
        d = exgcd(b,a % b,y,x);
        y -= (a / b) * x;
    }
    else {
        x = 1,y = 0;
    }
    return d;
}
int main(void)
{

    ll x,y,m,n,L;
    ll a,b,c,gcd,x1,y1,t;
    scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&L);
    c = x - y;
    a = n - m;
    b = L;
    gcd = exgcd(a,b,x1,y1);
    if(c % gcd)
        printf("Impossible\n");
    else {
        x1 = x1 * c / gcd;
        t = b / gcd;
        printf("%lld",(x1 % t + t) % t);
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章