Cod sursa(job #1747101)

Utilizator mihaitamoglanmihai moglan mihaitamoglan Data 24 august 2016 15:20:11
Problema Al k-lea termen Fibonacci Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.22 kb
type tablou=array [1..2,1..2]of int64;
var t:tablou;
    m:int64;
    f,g:text;

procedure exp (var t:tablou; m:int64);
  var a:tablou;
  begin
    if m=1 then begin
                   t[1,1]:=0; t[1,2]:=1; t[2,2]:=1; t[2,1]:=1;
                end
    else begin
          exp(t,m shr 1);
          a[1,1]:=t[1,1]; a[1,2]:=t[1,2];  a[2,1]:=t[1,2]; a[2,2]:=t[2,2];
          t[1,1]:=(a[1,1]*a[1,1]+a[1,2]*a[2,1]) mod 666013;
          t[1,2]:=(a[1,1]*a[1,2]+a[1,2]*a[2,2]) mod 666013;
          t[2,1]:=(a[2,1]*a[1,1]+a[2,2]*a[2,1]) mod 666013;
          t[2,2]:=(a[2,1]*a[1,2]+a[2,2]*a[2,2]) mod 666013;
          if m and 1 =1 then begin
                                     a[1,1]:=t[1,1]; a[1,2]:=t[1,2];  a[2,1]:=t[1,2]; a[2,2]:=t[2,2];
                                     t[1,1]:=a[1,2] mod 666013;
                                     t[1,2]:=(a[1,1]+a[1,2]) mod 666013;
                                     t[2,1]:=a[2,2] mod 666013;
                                     t[2,2]:=(a[2,1]+a[2,2]) mod 666013;
                              end;
         end;
  end;

begin
assign(f,'kfib.in');
assign(g,'kfib.out');
reset(f);
rewrite(g);
read(f,m);
exp(t,m-1);
write(g,t[2,2]);
close(f);
close(g);
end.