I and OI
Past...

给出一个线性同余方程组

      x≡b1(mod m1)
      x≡b2(mod m2)
      x≡b3(mod m3)
      ......
      x≡bn(mod mn)

其中m1,m2,...,mn两两互素,求x.

令M=m1*m2*m3*...*mn.

Mi=M/mi.

Mi'Mi≡1 (mod mi)

用扩展欧几里得算法求出Mi关于mi的乘法逆元Mi'.

x=∑Mi'Mibi mod M

code:

var   p,q,r:array[0..10000] of longint;
      n,i,m,xx,yy,ans:longint;


      function exgcd(a,b:longint; var x,y:longint):longint;
      var   t:longint;
      begin
            if b=0 then
            begin
                  exgcd:=a;
                  x:=1;
                  y:=0;
            end
            else
            begin
                  exgcd:=exgcd(b,a mod b,x,y);
                  t:=x;
                  x:=y;
                  y:=t-a div b*y;
            end;
      end;


begin
      readln(n);
      m:=1;
      for i:=1 to n do
      begin
            readln(p[i],q[i]);
            m:=m*q[i];
      end;

      for i:=1 to n do r[i]:=m div q[i];
      for i:=1 to n do
      begin
            exgcd(r[i],q[i],xx,yy);
            ans:=ans+xx*r[i]*p[i];
      end;

      writeln(Ans mod m);
end.
posted on 2011-08-09 10:17  exponent  阅读(507)  评论(0编辑  收藏  举报