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
_____MildTheorem