Lampa

Fie xi sirul de cuvinte obtinute. x0 si x1 sunt doua siruri initiale, iar, in rest, avem relatia xi = xi-1 + xi-2, pentru orice i > 1, unde a + b reprezinta concatenarea sirurilor de caractere a si b. Daca ni se da xN trebuie sa determinam x0 si x1. Sa notam x0 = A si x1 = B ( A si B sunt siruri de caractere ). Sirul x va avea forma: A, B, AB, BAB, ABBAB, BABABBAB, etc. Se observa ca numarul de siruri A din al N-lea termen este fibN-2, iar numarul de B este fibN-1, unde fib este sirul lui Fibonacci (fib0 = fib1 = 1 si fibn = fibn-1 + fibn-2 pentru orice n > 1).
Fie M = length(xN). Avem relatia: M = length(A) * fibN-2 + length(B) * fibN-1 (*). Aflam toate solutiile (length(A), length(B)) ale ecuatiei de mai sus. Pentru aceste lungimi A si B sunt unic determinate, in functie de paritatea lui N:

  • Daca N este par, A este egal cu primele length(A) caractere din xN si B este egal cu urmatoarele length(B) caractere.
  • Daca N este impar, B este egal cu primele length(B) caractere din xN si A este egal cu urmatoarele length(A) caractere.

Pentru A si B determinate verificam in complexitate O(M) daca intr-adevar al N-lea termen al sirului pornind de la A si B este sirul dat si, in caz afirmativ afisam perechea (A B).

Acest algoritm este in practica foarte rapid deoarece fib[N] atinge foarte repede valori mari. Pentru testele date, dupa cum reiesea si din tabelul din restrictiile problemei, avem:

TestNMNumarul de solutii ale ecuatiei (*)
185235
28420040
31050017
49891032
57461891155
66886005906
7253464681
81459000517
915101086012
101730271976

Se observa ca pe cele 10 teste folosite la corectare O(M) * O(numar_de_solutii_ecuatie) este relativ mic, deci o astfel de rezolvare garanteaza obtinerea punctajului maxim.