解形如 ax+by=c 或 ax ≡ c (mod b) 的方程
用exgcd() 先解出 ax + by = gcd(a,b)中的 x 和 y
x 和 y 再乘上 c / gcd(a,b)就是原方程的解
exgcd的原理:
a*x0 + b*y0 = gcd(a,b) = gcd(b , a%b) = b*x1+(a%b)* y1
又a%b=a-(a/b)*b;
所以
b*x1+(a%b)*y1 = bx1+ (a-(a/b)*b) *y1;
移项,得
a*y1 + b*(x1-a/b*y1)
即
a*x0+b*y0 = a*y1 + b* (x1-a/b*y1)
所以 x0 = y1 , y0= x1- a/b*y1;
所以求x0,y0先求得 x1,y1;
求x1,y1就得先求x2,y2;
一直求下去,直到 gcd(a,b)的b为0时,此时gcd(a,b)=a;
a*xn + b*yn = gcd(a,b)=a;
所以xn=1,yn=0,然后推回去,求得 x1,y1;
代码实现:
int exgcd(int a , int b , int &x , int &y)//返回的是gcd(a,b)
{
int d; // d是gcd(a,b)
if(b==0) //表示gcd(a,b)求出来了
{
x=1,y=0;
return a;
}
d= exgcd(b , a%b , x , y); //递归到最后一层
int xx = x;
x = y ; //上一层的 x = 当前层的 y
y = xx - (a/b) * y; //上一层的 y = 当前层的 x - (a/b)*y
return d;
}