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;
}

 

上一篇:扩展欧几里得求逆元模板


下一篇:php-在循环中使用cURL