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 }

 

转载于:https://www.cnblogs.com/BBBob/p/6611450.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值