这次思路倒是挺容易想。。

设答案为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 }
View Code

 

posted on 2015-10-30 22:30  onlyRP  阅读(172)  评论(0编辑  收藏  举报