POJ 1061 青蛙的约会

扩展欧几里得算法求解同余方程最小解

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 long long gcd(int a,int b){
 6     return b==0?a:gcd(b,a%b);
 7 }
 8 
 9 void exgcd(long long a,long long b,long long &d,long long &x,long long &y){
10     if (!b){
11         d=a;
12         x=1;
13         y=0;
14         return;
15     }
16     long long x1,y1;
17     exgcd(b,a%b,d,x1,y1);
18     x=y1;
19     y=x1-(a/b)*y1;
20     return ;
21 }
22 
23 int main(){
24 
25     long long x,y,m,n,l;
26     scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
27     long long t,a;
28     long long d;
29     d=gcd(n-m,l);
30     exgcd(n-m,l,d,t,a);
31     t=t*(x-y)/d;
32     long long s=l/d;
33     t=(t%s+s)%s;
34     if ((x-y)%d==0) printf("%lld",t);
35     else printf("Impossible");
36     return 0;
37 }

 

posted @ 2018-02-22 20:24  Travelller  阅读(108)  评论(0编辑  收藏  举报