欧几里得 扩展欧几里得

来源:互联网 发布:淘宝退款信用卡没到账 编辑:程序博客网 时间:2024/05/03 01:10

1.GCD

int gcd(int a, int b){    if(!b) return a;    return gcd(b,a%b);}

2.扩展欧几里得

  • 求a和b的最大公约数,
  • 求整数x和y,使得ax+by=gcd(a,b)
void  exgcd(int a, int b, int& d, int& x, int& y){    if(!b){ d = a; x = 1; y = 0;}    else{ exgcd(b, a%b, d, y, x); y -= a/b*x; }}

得到x和y后,可继续得到ax+by=c的整数解,下面计算了x

bool solve(int a, int b,int c, int& x,int& y){    int d;    exgcd(a, b, d, x, y);    if(!d || c%d) return false;    x *= c/d;    y *= c/d;    a /= d;    b /= d;    if(a<0) a=-a;    if(b<0) b=-b;    ((x %= b) += b) %= b;//此时x+mb,y-ma都是解,m为自然数      return true;}
0 0