数论专题poj1061

Posted mtl6906

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论专题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时,此方程无解。

 

以上是关于数论专题poj1061的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1061 青蛙的约会(扩展欧几里得算法)

数学#扩展欧几里德 POJ 1061&2115&2891

POJ 1061 青蛙的约会 扩展欧几里得

POJ1061

POJ1061 青蛙的约会

poj1061-青蛙的约会拓展欧几里得-不定方程