码迷,mamicode.com
首页 > 其他好文 > 详细

数论专题poj1061

时间:2017-09-28 22:29:12      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:pre   专题   turn   out   long   clu   namespace   正数   结果   

  技术分享

本题题意:两只青蛙,一只从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

标签:pre   专题   turn   out   long   clu   namespace   正数   结果   

原文地址:http://www.cnblogs.com/mtl6906/p/7608639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!