Editorial for Fibonacci, de nuevo


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: karellgz

Sea

Fn=[F(n)F(n+1)]

El vector que representa un par arbitrario de elementos consecutivos de Fibonacci.

Y sea C una matriz que cumple: C×Fn=Fn+1

En otras palabras, al multiplicar (por la izquierda) al vector, resulta el siguiente par consecutivo de Fibonacci, la matriz que cumple esto es:

C=[0111]

Tambien existe una matriz C1 tal que: C×C1=C1×C=I

Donde I es la matriz identidad.

La matriz que cumple esto es: C1=[1110]

Y en efecto se cumple:

C×C1=[0111]×[1110]=[0(1)+1101+101(1)+1111+10]=[1001]=I2

Se puede demostrar también que (Ck)1=(C1)k

Entonces, supongamos que la solución a el problema, la cual llamaremos n (se asegura que la solución es menor o igual que 109+6) se puede escribir de la siguiente forma: n=i+jq Donde i,j,q son enteros no negativos arbitrarios.

Y sabemos que Fn=Cn×F0

La solución la podemos escribir como:

Fn=Ci+jq×F0 =Cjq+i×F0 =Cjq×Ci×F0

(Multiplicamos a la izquierda ambos miembros por (Cjq)1)

(Cjq)1×Fn=I×Ci×F0 (Cjq)1×Fn=Ci×F0 (C1)jq×Fn=Ci×F0 (C1)jq×Fn=Fi

Utilizando esto podemos fijar q a un entero lo suficientemente grande y memoizar en un mapa todos los números de Fibonacci hasta q junto con su índice, en cada consulta solo quedaría iterar desde j=0 hasta 109+6q y calcular el lado izquierdo de la ecuación usando exponenciación binaria, si existe en el mapa, la solución es n=mapa[lhs]+jq

Complejidad de preprocesar (usando un mapa ordenado) O(qlogq)

Complejidad de cada consulta O((n/q)log2q) (lo cual es asintótico con O(nlog2q), pero deja más claro que la constante no es muy grande)

Nos queda una complejidad temporal: O(qlogq+t(n/q)log2q)

Y si hacemos q=n

Nos queda: O(tnlog2n)

Ejercicio para el lector:

Resolverlo en O(tn3logn)


Comments

There are no comments at the moment.