Особи Зета. На планете Зета обнаружены особи, которые размножаются по следующей схеме: каждая особь дважды создает себе подобную особь – одну в течение первой недели и еще одну в течение второй недели.
Требуется сделать прогноз по количеству новых особей на планете через некоторое время.
Формат ввода:
К ─ первоначальное количество особей (1 ≤ К ≤ 9)
М ─ количество недель, через которое нужно сделать прогноз, 1 ≤ М ≤ 1000
Формат вывода:
N ─ количество новых особей через M недель.
Пример:
Я чеcтно говоря не уверен, но вроде результаты похожие на правду:
uses crt;
function F(i: integer): integer;
begin
if i < 3 then F := i
else
F := F(i - 1) + F(i - 2);
end;
var
weeks, alive, one_create, total_created, i: integer;
begin
alive := 2;
weeks := 3;
one_create := 0;
for i := 1 to weeks - 1 do
inc(one_create, F(i));
total_created := alive * one_create;
writeln(total_created);
end.
В общем решение есть для небольших чисел, но без длинной арифметики тут не обойтись, потомучто при M = 1000 число - результат получается просто огромным, ну или я что-то напутал ...
Можно сделать ограничения, например, не более 100..это не принипиально.
Вот, потестируй:
function F(n: integer): Extended;
var
a, b, c, i: Extended;
begin
if n < 3 then F := n else begin
a := 2;
b := 3;
i := 3;
while i < n do begin
c := a;
a := b;
b := b + c;
i := i + 1;
end;
F := b;
end;
end;
var
weeks, alive, one_create, total_created, i: integer;
begin
alive := 2; // k
weeks := 3; // m
one_create := 0;
for i := 1 to weeks - 1 do
one_create := one_create + trunc(F(i));
total_created := alive * one_create;
writeln(total_created);
end.