I and OI
Past...

扩展欧几里得算法是用来求解形如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.
posted on 2011-08-09 10:11  exponent  阅读(448)  评论(0编辑  收藏  举报