这次思路倒是挺容易想。。
设答案为a,跑过b圈,由题意得ma+x=na+y+lb
整理后(m-n)a+lb=y-x 注意m-n的正负,用exgcd就可以了
但由于之前的数据都多少有些特殊,所以写得很慢。。(再这么慢下去可不行呀QAQ)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<queue> 6 #define inc(i,l,r) for(i=l;i<=r;i++) 7 #define dec(i,l,r) for(i=l;i>=r;i--) 8 #define mem(a) memset(a,0,sizeof(a)) 9 #define inf 1e9 10 #define ll long long 11 #define succ(x) (1<<x) 12 using namespace std; 13 ll read(){ 14 ll x=0,f=1;char ch=getchar(); 15 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 16 while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); 17 return x*f; 18 } 19 ll x,y,m,n,l,d,a,b; 20 void exgcd(ll a,ll b,ll&x,ll&y){ 21 if(b==0){ 22 d=a;x=1;y=0; 23 }else{ 24 exgcd(b,a%b,y,x); 25 y-=(a/b)*x; 26 } 27 } 28 int main(){ 29 x=read();y=read();m=read();n=read();l=read(); 30 if(m<n){ 31 swap(m,n);swap(x,y); 32 } 33 exgcd(m-n,l,a,b); 34 if((y-x)%d){ 35 printf("Impossible\n"); 36 return 0; 37 } 38 a*=(y-x)/d; 39 d=l/d; 40 printf("%lld",(a%d+d)%d); 41 return 0; 42 }