欧几里得算法
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
扩展欧几里得
一个结论:ax+by的最小正整数等于gcd(a,b);
如何求出ax+by=gcd(a,b)的解呢?
例如 60x+36y = gcd(60,36)
模拟一下gcd过程
序号 a b
1 60 36 1*36+24
2 36 24 1*24+12
3 24 12 2*12+0
我们令 a = 60 b=36。
1 60=1*36+24 即 a=b+24 =》 24 = a-b
2 36=1*24+12 即 b=(a-b)+12 =》 12=2b-a
所以 2b-a=12 即x=-1,y=2是 60x+36y=gcd(60,36)的一组解。
代码
typedef __int64 ll;
void ex_gcd(ll a, ll b, ll& d, ll& x, ll &y)
{
if(!b)
{
d = a, x = 1, y = 0;
}
else
{
ex_gcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
求出x,y的一组解(x1,y1)之后,根据线性方程定理,可得任意解(x1+k*b/gcd(a,b),y1-k*a/gcd(a,b)),其中k为任意整数。