Cod sursa(job #383265)

Utilizator cristi12345Balu Cristian cristi12345 Data 16 ianuarie 2010 11:15:34
Problema Iepuri Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.66 kb
//infoarena iepuri

type mat = array[1..3,1..3] of longint;

var m:mat;
    a,b,c,n:longint;
    x,y,z:int64;

function inmultire(a,b:mat):mat;
var i,j,k:integer;
    rez:mat;
    x,y,aux:int64;
begin
fillchar(rez,sizeof(rez),0);
for i:=1 to 3 do
        for j:=1 to 3 do
                begin
                aux:=0;
                for k:=1 to 3 do
                        begin
                        x:=a[i,k]; y:=b[k,j];
                        aux:=aux+x*y;
                        end;
                rez[i,j]:=aux mod 666013;
                end;

inmultire:=rez;
end;

function mlan(n:longint):mat;
var n1:mat;
    i:longint;
begin
{n1:=m;
for i:=2 to n do
        begin
        inmultire(aux,n1,m);
        n1:=aux;
        end;}
if n = 1 then begin mlan:=m; exit; end;
if n mod 2 = 0 then
        begin
        n1:=mlan(n div 2);
        mlan:=inmultire(n1,n1);
        end
else
        begin
        n1:=mlan(n-1);
        mlan:=inmultire(n1,m);
        end;
end;

procedure calc;
var mn:mat;
    rez,c1,c2,c3:int64;
begin
mn:=mlan(n);
c1:=mn[1,1]; c2:=mn[1,2]; c3:=mn[1,3];
rez:=c1*x + c2*y + c3*z;
//rez:=((mn[1,1]*x) mod 666013 +(mn[1,2]*y) mod 666013 +(mn[1,3]*z) mod 666013) mod 666013;
writeln(rez mod 666013);
end;

procedure citire;
var i,t:longint;
begin
assign(input,'iepuri.in'); reset(input);
assign(output,'iepuri.out'); rewrite(output);
readln(t);
for i:=1 to t do
        begin
        readln(x,y,z,a,b,c,n);
        fillchar(m,sizeof(m),0);
        m[1,2]:=1; m[2,3]:=1; m[3,1]:=c; m[3,2]:=b; m[3,3]:=a;
        calc;
        end;
close(input); close(output);
end;

begin
citire;
end.