poj1061青蛙的约会 同余方程

来源:互联网 发布:iso软件开发 编辑:程序博客网 时间:2024/04/30 13:48

题目是中文就不解释了,题目链接

设t是跳的步数 由于每走L米就回原点,故可以建立一个同余方程(x+mt)(y+nt)%L  =>(x+mt)-(y+nt)=kL => x-y=kL-(n-m)t,用欧几里得求最小的正整数t即可

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;long long x,y;long long gcd(long long a,long long b){   if(b==0)      return a;    return gcd(b,a%b);}long long Extended(long long a,long long b){   if(b==0){    x=1;y=0;    return a;   }  long long d=Extended(b,a%b);  long long temp=x;  x=y;  y=temp-a/b*y;  return d;}int main(){long long p,q,m,n,l,t1,t2;cin>>p>>q>>m>>n>>l;t1=t2=1e15; if((p-q)%gcd(l,m-n)==0){    long long d=Extended(l,n-m);    long long t=l/d;    y=y*(p-q)/d;    t1=(y%t+t)%t; } if(t1==1e15)    cout<<"Impossible"<<endl; else cout<<t1<<endl;}


原创粉丝点击