扩展欧几里得算法是用来求解形如ax+by=c的方程的.
令d=gcd(a,b),若d不整除c则方程无解.
我们先考虑这个方程:ax+by=d
∵gcd(a,b)=gcd(b,a mod b)
∴d=ax+by=bx'+(a mod b)y'=bx'+(a-[a/b]b)y'=ay'+b(x'-[a/b]y')
令x=y'
y=x'-[a/b]y'
当b=0时,d=a=ax+by
得x=1,y=0.
求出ax+by=d的一组解x',y'后,
由(c/d)ax'+(c/d)by'=(c/d)d
即可得到ax+by=c的一组特解:x0=(c/d)x',y0=(c/d)y'
所有解可表示为x=x0+(b/d)n,y=y0-(a/d)n.
code:
function inv(a,b:longint):longint; var d,x,y:longint; begin d:=gcd(a,-b,x,y); inv:=(z(x)*z(d) mod b+b) mod b; end;
求逆元 ↑
var a,b,x,y:longint; function exgcd(a,b:longint; var x,y:longint):longint; var t:longint; begin if b=0 then begin x:=1; y:=0; exit(a); end; exgcd:=exgcd(b,a mod b,x,y); t:=x; x:=y; y:=t-a div b*y; end; begin readln(a,b); //ax+by=gcd(a,b) exgcd(a,b,x,y); writeln(x,' ',y); end.