poj 1061 线性同余方程

题意:地球纬度长L,青蛙A和青蛙B同时向西跳,起点分别为x,y,速度分别为m,n,问多久相遇?

分析:

( x + mt ) - ( y + nt ) = kL

=>( m - n ) t - ( y - x ) = kL

=>( m - n ) t - kL = ( y - x )

令 a = m - n , b = L , c = y - x , X = t , Y = k

则原等式转换为 aX-bY=c, 剩下就是扩展gcd了。。

 

 

LL gcd(LL x, LL y){
     if (!x || !y) return x + y;
     for (LL t; t = x % y; x = y, y = t);
     return y;
}

LL extgcd(LL a, LL b, LL & x, LL & y){ //扩展 求x, y使得gcd(a, b) = a * x + b * y;
   if (b == 0) { x=1; y=0; return a; }      //x+=b  y-=a仍成立
   LL d = extgcd(b, a % b, x, y);
   LL t = x; x = y; y = t - a / b * y;
   return d;
}

bool mgcd(LL a,LL b,LL &x,LL &y,LL n){ //求 a*x + b*y = n
    LL d = extgcd(a, b, x, y);
    if(n % d != 0) return false;
    LL k = n / d;
    x *= k;     y *= k;
    return true;
}



int main(){
    LL x, y, n, m, l;
    cin>>x>>y>>m>>n>>l;
    LL a=m-n, b=l, c=y-x;
    //if(a<0) {a=-a; c=-c;}
    if( !a || !mgcd(a, b, x, y, c) )cout<<"Impossible"<<endl;
    else cout<< (x%b+b)%b <<endl;
    return 0;
}

 

posted @ 2013-05-26 22:42  心向往之  阅读(141)  评论(0编辑  收藏  举报