推荐博客 :https://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
欧几里得又称为辗转相除法,是用来求最大公约数的一种高效的算法。
核心就是一点 gcd(a, b) = gcd(b, a%b) ;
int gcd(int a, int b){
if (b == 0) return a;
return gcd(b, a%b);
}
扩展欧几里得
两个不定方程(扩展欧几里得算法作用之处)
定理:若ax+by=g,(g=gcd(a,b),即g是a,b的最大公约数)有整数解;
则ax+by=c(c是g的倍数)有整数解 , 若 c 不是 gcd 的倍数,则其不存在整数解。
设ExtendedGCD为扩展欧几里得算法,它接受两个整数a,b,返回两个整数x,y。
若有ax+by=gcd(a,b),则ExtendedGCD(a,b)可求x,y。
1.设a, b, c为任意整数。若方程ax+by=c的一组整数解为(x0,y0),则它的任
意整数解都可以写成(x0+kb', y0-ka'),其中a'=a/gcd(a,b),b'=b/gcd(a,b),k取任意整数。
2.设a, b, c为任意整数,g=gcd(a,b),方程ax+by=c的一组解是(x0,y0),则
当c是g的倍数时ax+by=c的一组解是(x0c/g, y0c/g);当c不是g的倍数时无整数解。

代码示例:
int e_gcd(int a, int b, int &x, int &y){
if (b == 0){
x = 1;
y = 0;
return a;
}
int r = e_gcd(b, a%b, x, y);
int t = x;
x = y;
y = t - (a/b)*y;
return r;
}
紫书上的 exgcd
void exgcd(int a, int b, int &d, int &x, int &y){ // d 表示gcd
if (b == 0) {d = a; x = 1; y = 0; }
else {exgcd(b, a%b, d, y, x); y -= (a/b)*x; }
}