数论专题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的主要内容,如果未能解决你的问题,请参考以下文章