MWPZ - Mistrzostwa Wielkopolski w Programowaniu Zespolowym

Tutorial

Tik tak tik tak tik tak... chrrrr zzzzz

Powsta³ w g³owie nowy algorytm. W my¶l niego mo¿na napisaæ ten program przy pomocy rekurencji, bo przecie¿ liczby Fibonacciego s± zdefiniowane rekurencyjnie.

var
  d,n,i : longint;
 
function fib(x: longint): longint;
begin
  if x=0 then fib:=0;
  if x=1 then fib:=1;
  fib:=(fib(x-1)+fib(x-2)) mod 10000
end;

begin
  readln(d);
  while (d>0) do
  begin
    d:=d-1;
    readln(n);
    writeln(fib(n));
  end;
end.

Wys³anie takiego programu spowoduje, ¿e Sprawdzarka zwróci ocenê:

Time Limit Exceeded

Oznacza to, ¿e w program dzia³a³ za d³ugo. W tym przypadku liczby Fibonacciego licz± siê zbyt wiele razy i to powoduje, ¿e komputer wykonuje mnóstwo niepotrzebnych operacji. Np. dla N = 4 wyliczymy fib(4) => (fib(3) i fib(2)), potem fib(3) => (fib(2) i fib(1)) i fib(2) => (fib(1) i fib(0)), a potem jeszcze raz fib(2) => (fib(1) i fib(0)). Jak widaæ te same warto¶ci licz± siê kilka razy. Dla du¿ych liczb powtarzaj±cych siê operacji bêdzie bardzo du¿o i program bêdzie dzia³a³ d³ugo. Mówi±c fachowo, algorytm taki ma z³o¿ono¶æ rzêdu O(2N). Oznacza to, ¿e algorytm jest wyk³adniczy i bêdzie dzia³a³ zbyt d³ugo.

Uwaga! Program uruchomiony na Sprawdzarce testowany jest na innych danych, ni¿ te z tre¶ci zadania. Je¶li w tre¶ci s± przyk³ady o ma³ych warto¶ciach zmiennych (np. N = 2), nie oznacza to wcale, ¿e takie same bêd± na Sprawdzarce. Wrêcz przeciwnie, ka¿dy program jest testowany na danych du¿ych (np. N = 20000), a tak¿e z³o¶liwych przypadkach szczególnych (np. N = 0).