poj2115 C Looooops 空间 2012-01-14

http://poj.org/problem?id=2115

_______________________________________

求 a+cx=b (mod 2^k)

用exgcd求线性模方程!

_______________________________________

 1 Program Stone;
 2 var i:longint;
 3     a,b,c,k,x,y,g,ans:int64;
 4     sh:array[0..50]of int64;
 5 
 6  Function exgcd(a,b:int64;var x,y:int64):int64;
 7  var i:int64;
 8   begin
 9      if b=0 then begin x:=1;y:=0;exit(a);end;
10      exgcd:=exgcd(b,a mod b,x,y);
11      i:=x;
12      x:=y;
13      y:=i-(a div b)*y;
14   end;
15 begin
16   assign(input,'input.in');reset(input);
17   sh[0]:=1;
18   for i:=1 to 32 do sh[i]:=sh[i-1]*2;
19   readln(a,b,c,k);
20   while (a<>0)or(b<>0)or(c<>0)or(k<>0) do
21    begin
22      g:=exgcd(c,sh[k],x,y);
23      if (b-a) mod g<>0 then writeln('FOREVER')
24                        else begin
25                               ans:=x*(b-a) div g mod sh[k]+sh[k];
26                               writeln(ans mod (sh[k] div g));
27                             end;
28      readln(a,b,c,k);
29    end;
30 end.
31 
32  
33 
34  

 

posted on 2016-03-02 20:50  Yesphet  阅读(98)  评论(0编辑  收藏  举报