版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
exgcd求解一般线性方程组ax+by=c
算法复杂度是
其实等同于求解
这个方程,首先看第一种情况
1.首先考虑ax+by=m,且m%gcd(x,y)!=0
这种情况下肯定无解,不作证明,证明比较简单
2.然后考虑
由于
,直到y=0此时返回x的值就等于
(这是gcd最核心的难点理解)
*b)
我们设a,b是未知量
则可以知道
(这个叫递归算法核心?
3.考虑 (M是非零整数)
其实就是先求解
的情况,得到的
令
解出的x解系还原回去
如果要求x的最小整数解的话,就要加一部对x的操作,具体见代码
如果要求对应的y的话,直接代回原方程即可
ll exgcd(ll a,ll b,ll &x,ll &y)
//&必须写的原因是并不是x,y是作为一个地址在进行递归,所以需要取地址符
{
if (b==0)
{
x=1;
y=0;
return a;
}
else
{
ll gcd=exgcd(b,a%b,y,x);
y-=x*(a/b);
return gcd;
}
}
int main()
{
a=;b=;c=;
g=exgcd(a,b,x,y);//返回的是a,b的gcd
if (c%g!=0) {cout<<"Impossible"<<endl;return 0;}
//如果c不是gcd(a,b)的倍数的话,就无法求解,不作证明
ll M=c/g;
x*=M;
ll t=b/g;
if (b<0)b=-b;
x=(x%t+t)%t;//根据解系求最小整数解,注意此时的b一定要是非负数
WW(x);
//如果要求y的话就根据原方程进行转化可得到
}