k : byte; arr : array of int64; function Fn (c : byte) : int64; begin if arr[c - 1] <> 0 then begin Fn := arr[c - 1]; exit; end; if c < 3 then Fn := 1 else Fn := Fn (c - 1) + Fn (c - 2); arr[c - 1] := Result; end;
begin read (k); setlength (arr, k); writeln (Fn (k)); end.
var n : byte; arr : array of int64;
tmp : int64; function Fn (c : byte) : int64; begin if arr[c - 1] <> 0 then begin Fn := arr[c - 1]; exit; end; if c < 3 then Fn := 1 else Fn := Fn (c - 1) + Fn (c - 2); arr[c - 1] := Result; end;
begin read (n); setlength (arr, n); tmp := (Fn (n));
tmp := 0;
for i := 1 to n do
tmp := (tmp + arr[i]) mod 2;
if tmp = 1 then writeln ('No') else writeln ('Yes');
end.
Это нисходящее динамическое программирование. В массиве Arr храняится сами числа. Рекурсивная функция Fn (n) возвращает N-ое число. В б) мы сначала просчитываем n чисел (то есть считаем число n, так как для него нужны все предыдущие), а потом ищем их сумму. Так как числа могут быть большими, то мы берем сразу их остаток от деления 2 во избежание преполнения.
Ln - это от line То есть при write/writeln в первом случае на следующую строку не переходит, а во втором - переходит. Со вводм что-то похожее. Например for i := 1 to 10 do read (a);
10 раз идет read. Можно ввести сразу 10 чисел, они сохранятся, и после уже не будет требовать вводить еще 9 раз, а возьмет из буфера. А при readln - нифига подобного. Буфер будет очищаться и придется каждый раз вводить заново. Еще readln без параметров часто используется для ожидания любой клавиши, а writeln - для простого перевода на новую строку, что не проходит с read и write.
var
k : byte;
arr : array of int64;
function Fn (c : byte) : int64;
begin
if arr[c - 1] <> 0 then
begin
Fn := arr[c - 1];
exit;
end;
if c < 3 then Fn := 1
else Fn := Fn (c - 1) + Fn (c - 2);
arr[c - 1] := Result;
end;
begin
read (k);
setlength (arr, k);
writeln (Fn (k));
end.
var
n : byte;
arr : array of int64;
tmp : int64;
function Fn (c : byte) : int64;
begin
if arr[c - 1] <> 0 then
begin
Fn := arr[c - 1];
exit;
end;
if c < 3 then Fn := 1
else Fn := Fn (c - 1) + Fn (c - 2);
arr[c - 1] := Result;
end;
begin
read (n);
setlength (arr, n);
tmp := (Fn (n));
tmp := 0;
for i := 1 to n do
tmp := (tmp + arr[i]) mod 2;
if tmp = 1 then writeln ('No') else writeln ('Yes');
end.
Это нисходящее динамическое программирование. В массиве Arr храняится сами числа. Рекурсивная функция Fn (n) возвращает N-ое число. В б) мы сначала просчитываем n чисел (то есть считаем число n, так как для него нужны все предыдущие), а потом ищем их сумму. Так как числа могут быть большими, то мы берем сразу их остаток от деления 2 во избежание преполнения.
Ln - это от line
То есть при write/writeln в первом случае на следующую строку не переходит, а во втором - переходит. Со вводм что-то похожее. Например
for i := 1 to 10 do read (a);
10 раз идет read. Можно ввести сразу 10 чисел, они сохранятся, и после уже не будет требовать вводить еще 9 раз, а возьмет из буфера. А при readln - нифига подобного. Буфер будет очищаться и придется каждый раз вводить заново.
Еще readln без параметров часто используется для ожидания любой клавиши, а writeln - для простого перевода на новую строку, что не проходит с read и write.