poj1061 青蛙的约会(扩展欧几里得)

题目
题意:在一自东向西首尾相连长为L单位的坐标轴上有两只青蛙分别位于X,Y,它们跳一次分别为m,n个单位,问能否相遇,能输出需要跳几次。否输出impossible。
解法:

int X , Y , m , n , L , x , y , d;

void ex_gcd(int a , int b , int &d , int &x , int &y){
    if(!b){
        d = a ;
        x = 1 ;
        y = 1 ;
    }else{
        ex_gcd(b , a%b , d , x , y);
        int t = x ;
        x = y ;
        y = t - (a/b)*y;
    }
}

int cal(int a , int b , int c){
    ex_gcd(a , b , d , x , y);
    if(c%d) return -1 ;
    int t = b/d;
    x = x*c/d;
    return (x%t+t)%t;
}

void solve(){
    cin >> X >> Y >> m >> n >> L ;
    int a = m - n  , b = L , c = Y - X ;
    if(a < 0){//保证a是正数因为这样在求gcd时不会出现负数,同时与c同号(跟据追赶关系可得)
        c = -c ;
        a = -a ;
    }
    int t = cal(a , b , c);
    if(t == -1){
        cout << "Impossible" << endl;
    }else{
        cout << t << endl;
    }
}
posted @ 2020-06-16 11:08  无名菜鸟1  阅读(143)  评论(0编辑  收藏  举报