poj 1061 青蛙的约会 (扩展gcd, 模线性方程)

来源:互联网 发布:程序员的数学线性代数 编辑:程序博客网 时间:2024/04/28 14:40

好长时间没贴代码了,这段时间看了些数论,水了几道题,过一段时间把以前的题好好整理下。唉,算法学不成器,技术又不过关,菜鸟都要哭死了

这道题使用模线性方程做的,注意应该使用 long long 或 __int64数据类型,具体的exgcd 函数 和 解模线性方程 可以参照 《算法导论》。

//#include <iostream>#include <math.h>using namespace std;__int64 dis,step;__int64 exgcd(__int64 a,__int64 b,__int64 & x,__int64 & y)// a > b{if(0==b){x = 1;y = 0;return a;}else{__int64 xt,yt,ret = 0;ret = exgcd(b,a % b,xt,yt);x = yt;y = xt - (a / b ) * yt;return ret;}}void MLES(__int64 a,__int64 b,__int64 n)// ax = b(mod n){__int64 x, y ,d;d = exgcd(a,n,x,y);if(0== b % d){__int64 xt = x * (b / d) % n;while(xt < 0)xt += (n / abs((double)d));cout<<xt<<endl;}elsecout<<"Impossible"<<endl;}int main(){__int64 px,py,m,n,L;while(cin>>px>>py>>m>>n>>L){ dis = (py - px) % L;//第二只 相对于第一只的 距离 step = (m - n) % L;//第一只 的步进速度if(dis==0)cout<<0<<endl;else if(0==step)cout<<"Impossible"<<endl;elseMLES(step,dis,L);}return 0;}


0 0
原创粉丝点击