欧几里得 扩展欧几里得
2016-08-10 15:35
211 查看
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; }