gcd与exgcd

gcd:

整型求法

 int gcd(int x,int y) { return b?gcd(b,a%b):a; } 

浮点型求法

1 double gcd(double a,double b)  
2 {  
3     return a < eqs ? b : gcd(fmod(b,a),a);  
4 }

 exgcd(摘自:戳这里):

 1 typedef long long LL;
 2 
 3 LL exgcd(LL a,LL b,LL &x,LL &y){
 4 
 5      if(a==0&&b==0) return -1;
 6 
 7      if(b==0) { x=1;y=0; return a;  }
 8 
 9      LL d=exgcd(b,a%b,y,x);
10 
11      y-=a/b*x;
12 
13      return d;
14 
15 }
16 
17 LL MLE(LL a,LL b,LL mod){  // 返回(a*x)%mod=b 的最小正整数解
18 
19     LL x,y;
20 
21     LL gcd=exgcd(a,mod,x,y);
22 
23     if(b%gcd!=0) return -1;  //若返回-1,则该方程无解
24 
25     x*=b/gcd;
26 
27     mod/=gcd;
28 
29     if(mod<0) mod=-mod;
30 
31     LL ans=x%mod;
32 
33     if(ans<=0) ans+=mod;  //其他解为: ans+i*mod (i为整数)
34 
35     return ans;
36 
37 }
38 
39 LL x0,y0,kx,ky;
40 
41 bool LE(LL a,LL b,LL c){   //解线性方程ax+by=c
42 
43     LL x1,y1;
44 
45     LL gcd=exgcd(a,b,x1,y1);
46 
47     if(c%gcd)return false;  //无整数解
48 
49     x0=x1*c/gcd,y0=y1*c/gcd;
50 
51     kx=b/gcd,ky=-a/gcd;
52 
53     return true;   //有解,解集为:(x0+kx*t,y0-ky*t) t为整数
54 
55 }
View Code

 

posted @ 2017-10-02 19:29  euzmin  阅读(201)  评论(0编辑  收藏  举报