poj 1061 青蛙的约会(扩展欧几里得)

来源:互联网 发布:以太网数据帧最大长度 编辑:程序博客网 时间:2024/04/27 22:29

          中文题就不说题意了吧……最近打算学学数论,数学相关的真是一点都不会啊Orz,首先是一发基础的……这题以前做过,但是当时做得稀里糊涂的,连扩展欧几里得还不太明白就瞎搞搞过了,今天又做了一遍,把公式神马的都重推了一遍,感觉不错,唉,以后做题要注意了,不能没搞懂就过去了。。。。

          设两只青蛙一共跳了t次,那么就可以得到一个方程:(a+mt)-(b+nt)=kL   (k=0,1,2,3,4......),移项,可以得到:(m-n)t-Lk=y-x,t和k为未知数,剩下就是扩展欧几里得直接求方程的解了,这里求出的t不一定最优,对L取模即可。


代码:


#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<set>#include<stack>#include<cmath>#include<vector>#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFFFFFFFFFLL#define eps 1e-9#define pi acos(-1.0)using namespace std;typedef long long ll;ll ext_gcd(ll a,ll b,ll &x,ll &y){    if(b==0)    {        x=1;y=0;        return a;    }    ll d=ext_gcd(b,a%b,y,x);    y-=a/b*x;    return d;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    ll a,b,m,n,L,x,y;    cin>>a>>b>>m>>n>>L;    ll A=m-n,B=-L,C=b-a;    ll d=ext_gcd(A,B,x,y);    if(C%d!=0)        cout<<"Impossible"<<endl;    else    {        x=x*C/d;        if(B<0) B=-B;        x=(x%B+B)%B;        cout<<x<<endl;    }    return 0;}

0 0