Đề bài: http://vn.spoj.com/problems/DHLOCO/
Thuật toán:
- Sub2: QHĐ f[i] = f[i-1]+f[i-2]+f[i-3];
- Sub3: Nhân ma trận
Code:
const
fi='dhloco.inp';
fo='dhloco.out';
mt1 : array[1..3,1..3] of int64=((0,0,1) , (1,0,1) , (0,1,1));
mt2 : array[1..3,1..3] of int64=((1,2,4) , (0,0,0) , (0,0,0));
type
matrix = array[1..3,1..3] of int64;
var
n : int64;
i,j,k,m : longint;
function mul(a,b :matrix) : matrix;
var c : matrix;
i,j,k : longint;
begin
for i := 1 to 3 do
for j := 1 to 3 do
begin
c[i,j] := 0 ;
for k := 1 to 3 do
c[i,j] := (c[i,j] + a[i,k] * b[k,j]) mod m;
end;
exit(c);
end;
function power(a : matrix; y : int64) : matrix;
var tg : matrix;
begin
if y = 1 then exit(a);
tg := power(a,y shr 1);
if y mod 2 = 0 then exit(mul(tg , tg)) else exit(mul(mul(tg,tg),a));
end;
procedure main;
var a,b,c : matrix;
begin
// assign(input,fi);reset(input);
// assign(output,fo);rewrite(output);
read(n,m);
if n=1 then begin writeln(1 mod m); exit; end;
if n=2 then begin writeln(2 mod m); exit; end;
if n=3 then begin writeln(4 mod m); exit; end;
a := mt1;
b := mt2;
a := power(a , n-3);
c := mul(b,a);
writeln(c[1,3]);
//close(input);close(output);
end;
begin
main;
end.
Recent Comments