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