【luogu1516】 青蛙的约会 [扩展欧几里德]

P1516 青蛙的约会

可以推出来 (x+va*t)-(y+vb*t)=p*l     然后化成(l*p+(b-a)*t+l*p=x-y

然后有一个我也不晓得叫什么的定理 a*x+b*y=c 如果gcd(a,b)不能整除c 那无解

然后还有一个我还是不晓得名字的东西 先求出方程a*x+b*y=c的一个解x0 y0 然后通解为 x=x0-b*t y=y0+a*t  t为整数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 ll xa,xb,va,vb,l;
 5 
 6 template<class t>void rd(t &x)
 7 {
 8     x=0;int w=0;char ch=0;
 9     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
10     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
11     x=w?-x:x;
12 }
13 
14 ll exgcd(ll a,ll b,ll &x,ll &y)
15 {
16     if(!b) {x=1,y=0;return a;}
17     ll r=exgcd(b,a%b,x,y);
18     ll t=x;x=y,y=t-a/b*y;
19     return r;
20 }
21 
22 int main()
23 {
24     rd(xa),rd(xb),rd(va),rd(vb),rd(l);
25     int b=vb-va,a=xa-xb;
26     if(b<0) b=-b,a=-a;
27     if(va==vb) printf("Impossible"),exit(0);//速度一样
28     ll x,y,gcd=exgcd(b,l,x,y);
29     if((xb-xa)%gcd) printf("Impossible"),exit(0);
30     printf("%lld",(x*(a/gcd)%(l/gcd)+l/gcd)%(l/gcd));
31     return 0;
32 }

嘿嘿嘿

posted @ 2019-03-22 11:35  委屈的咸鱼鱼鱼鱼  阅读(212)  评论(0编辑  收藏  举报