P1516 青蛙的约会
P1516 青蛙的约会
x+mt-p1L=y+nt-p2L
(m-n)t+L(p2-p1)=y-x
令p=p2-p1
(m-n)t+Lp=y-x
然后套扩欧就完事了
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #include<map> #include<stack> #include<cstring> #define inf 2147483647 #define ls rt<<1 #define rs rt<<1|1 #define lson ls,nl,mid,l,r #define rson rs,mid+1,nr,l,r #define N 100010 #define For(i,a,b) for(long long i=a;i<=b;i++) #define p(a) putchar(a) #define g() getchar() using namespace std; long long x,y,m,n,L,g; long long a,b,c,t,p; long long flag=1; void in(long long &x){ long long y=1; char c=g();x=0; while(c<'0'||c>'9'){ if(c=='-')y=-1; c=g(); } while(c<='9'&&c>='0'){ x=(x<<1)+(x<<3)+c-'0';c=g(); } x*=y; } void o(long long x){ if(x<0){ p('-'); x=-x; } if(x>9)o(x/10); p(x%10+'0'); } long long gcd(long long a,long long b){ return b==0?a:gcd(b,a%b); } void exgcd(long long a,long long b,long long &x,long long &y){ if(!b){ x=1; y=0; return; } exgcd(b,a%b,x,y); long long temp=x; x=y; y=temp-(a/b)*y; } int main(){ in(x);in(y);in(m);in(n);in(L); if(m-n<0) flag=-1; a=max(m-n,n-m); b=L; g=gcd(a,b); if((y-x)%g!=0){ cout<<"Impossible"; return 0; } exgcd(a,b,t,p); t*=flag; t*=(y-x)/g; p*=(y-x)/g; b/=g; o((t%b+b)%b); return 0; }