Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
36
Добавлен:
25.04.2015
Размер:
1 Кб
Скачать
{$mode objfpc}

const 
    n = 20;
    m = 1000000007;
    
type TMatrix = array [1..2, 1..2] of integer;

var i: integer;

function mul(A, B: TMatrix): TMatrix;
var 
    i, j, k: integer;
begin
    for i := 1 to 2 do begin
        for j := 1 to 2 do begin
            result[i, j] := 0;
            for k := 1 to 2 do begin
                result[i, j] := (result[i, j] + A[i, k]*int64(B[k, j])) mod m;
            end;
        end;
    end;
end;

function deg(A: TMatrix; n: integer): TMatrix;
var
    t: TMatrix;
begin
    if n = 0 then begin
        result[1, 1] := 1; result[1, 2] := 0;
        result[2, 1] := 0; result[2, 2] := 1;
        exit;
    end;
    if n mod 2 = 0 then begin
        t := deg(A, n div 2);
        result := mul(t, t);
    end else begin
        result := mul(deg(A, n-1), A);
    end;
end;

function fib(n: integer): integer;
var
    c, A: TMatrix;
begin
    A[1, 1] := 0; A[1, 2] := 1;
    A[2, 1] := 1; A[2, 2] := 1;
    c := deg(A, n);
    result := (c[1, 1] + c[1, 2]) mod m;
end;

begin
    for i := 0 to n do begin
        writeln(fib(i));
    end;
end.


















Соседние файлы в папке 14_numeric