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 }