数论专题poj1061

  

本题题意:两只青蛙,一只从x开始跳,每次跳m格,一只从y开始跳,每次跳n格,地球的线长为L米,问两蛙是否可能相遇,以及相遇的时刻。

代码如下:

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

这道题是一道标准的同余模方程,首先由题意列出(x+mt) - (y+nt) = lc,表示两者之差是L的倍数,也只有这种情况才能相遇。

然后化成(m-n)t + lc = y - x

我们要求的就是最小的正整数t。

exgcd求出的x,y是方程(m-n)t + lc = gcd(m-n,l)的解

要求(m-n)t + lc = y - x

需要两边乘上一个p = (y - x) / gcd(m-n,l)

式子变为了(m-n)(pt) + l(pc) = y - x

然后结果就是t_ = pt

最后,为了保证t_是正数,只需要 t_ = (t_ % l + l) % l.

另外当y - x mod gcd(m-n,l)不为0时,此方程无解。

 

posted @ 2017-09-28 21:19  mtl6906  阅读(88)  评论(0编辑  收藏  举报