poj 1061 青蛙过河

题目中文的,就不赘述题意了。

推理过程:

  1. 题目实际是求一个k,领得(km + x) %L == (kn + y)%L 。
  2. 上式可推理为 (k(m-n) + (x -y )) %L == 0
  3. 也就是求同余方程 ax %M == b %M

同余方程参考扩展欧几里德算法。网上有很多资料了,不再赘述。

#include <iostream>
using namespace std;

long long extend_gcd(long long a,long long b,long long &x,long long &y)
{    if(b==0){
        x=1;y=0;
        return a;
    }else{
        long long r=extend_gcd(b,a%b,y,x);
        y-=x*(a/b);
        return r;
    }    
}

void solve(long long int a,long long int b,long long int M){
    long long x, y;
    long long gcd=extend_gcd(a,M,x,y);
    if(b%gcd!=0)    
        cout<<"Impossible"<<endl;
    else{    
        x=x*b/gcd;
        int t=M/gcd;
        if(x>=0)
            x=x%t;
        else
            x=x%t+t;
        cout<<x<<endl;
    }
} 

int main(int argc, char *argv[])
{
    long long int x, y, m, n, L;
    while(scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&L)!=EOF)
    {
        long long int a = m - n;
        if( a < 0) a = (a + L) % L;
        long long int b = y - x ;
        if( b < 0) b = (b + L) % L;
        solve(a, b, L);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zerooffdate/article/details/81606506