相信大家已经学会如何解二元一次方程组了
对于
{a1x+b1y=c1a2x+b2y=c2
在有解的情况下
{x=b2c1−b1c2a1b2−a2b1y=a1c2−a2c1a1b2−a2b1
即
{x=|c1 b1c2 b2||a1 b1a2 b2|y=|a1 c1a2 c2||a1 b1a2 b2|
但是对于不定方程ax+by=c(a,b,c为整数)怎么求出其中一组整数解呢?
首先我们记 d=gcd(a,b) ,如果 c%d≠0 (“%”表示取模”mod”,下同),那么方程ax+by=c无整数解,(表示不会证,具体参看贝祖定理)
那么根据裴蜀定理(其实是一个东东),可得对于 ax+by=c(d|c) 都有一组整数解
设 c′=c/d,x′=x/c′,y′=y/c′ 有方程 ax′+by′=gcd(a,b) ,最后求出x,y即可。
那么对于方程ax+by=gcd(a,b)如何去解呢?
首先我们知道 gcd(a,b)=gcd(b,a%b)
prove:
若a < b ,则 a%b=a , gcd(b,a%b)=gcd(b,a)=gcd(a,b)
若a > b ,则 a%b=a−kb(k∈N+)
设 c=gcd(a,b),a=pc,b=qc 则 p,q互质,a%b=(p−kq)c
∵gcd(q,kq)=q,p,q互质∴p−kq≡p(modq)∴gcd(q,p−kq)=1
∴gcd(b,a%b)=gcd(qc,(p−kq)c)=c=gcd(a,b)
有了上面这个定理后,方程可以进行如下变换:
∵ax+by=gcd(a,b)∴bx+(a%b)y=gcd(b,a%b)
∵gcd(a,b)=gcd(b,a%b)∴ax+by=bx+(a%b)y=bx+(a−[ab]b)y
∴ax+by=ay+b(x−[ab]y)①
我们设
f(a,b)=(x,y)
表示方程
ax+by=gcd(a,b)
的一组整数解
x,y
令
f(b,a%b)=(x′,y′)
对于任意a,b要使式子①成立有
x=y′,y=x′−[ab]y′
当
b=0时,此时x=1,y=0即可满足条件
所以扩展GCD是个以普通GCD为基础的递归。
代码如下:
void exGcd(long long a,long long b,long long &x,long long &y){
if(b==0){x=1,y=0;return;}
exGcd(b,a%b,x,y);
long long t=y;y=x-a/b*y;x=t;
}