CF787A - The Monster

 1 /*
 2  CF787A - The Monster
 3  http://codeforces.com/contest/787/problem/A
 4  数学 扩展欧几里得
 5  注意x或y为0的时候要特判
 6  并且结果要大于b和d
 7  */
 8 #include <cstdio>
 9 int ex_gcd(int a,int b,int &x,int &y)//solve x,y in a*x+b*y=ex_gcd(a,b,x,y)=gcd(a,b);
10 {
11     if(b==0)
12     {
13         x=1;
14         y=0;
15         return a;
16     }
17     int ans=ex_gcd(b,a%b,x,y);
18     int tmp=x;
19     x=y;
20     y=tmp-a/b*y;
21     return ans;
22     //x = x0 + (b/gcd)*t
23     //y = y0 – (a/gcd)*t
24      
25 }
26 int main()
27 {
28     int a,b,c,d;
29     scanf("%d%d%d%d",&a,&b,&c,&d);
30     int l=d-b;
31     int x,y;
32     if((b-d)%c==0 && (b-d)/c>=0 )//特判x==0时
33     {
34         printf("%d\n",b);
35         return 0;
36     }   
37     if((d-b)%a==0 && (d-b)/a>=0 )//特判y==0时
38     {
39         printf("%d\n",d);
40         return 0;
41     }
42     int gcd=ex_gcd(a,c,x,y);
43     if(l%gcd)
44     {
45         printf("-1\n");
46         return 0;
47     }
48     x*=l/gcd;
49     c/=gcd;
50     if(c<0)
51         c=-c;
52     x%=c;
53     while(x<=0 || b+x*a<d)//结果要大于b和d
54         x+=c;
55     printf("%d\n",b+x*a);
56     return 0;
57 }

 

posted @ 2017-03-24 14:44  BBBob  阅读(354)  评论(0编辑  收藏  举报