Estoy tratando de resolver este problem en Haskell pero superando el límite de tiempo. Apliqué todo mi Haskell y la habilidad matemática para optimizar esto, pero todo fue en vano. ¿Podría alguien por favor sugerirme cómo optimizar este código aún más? La secuencia F_3 + F_7 + F_11 .... + F_ (4n + 3) = F_2n * F_ (2n + 1). Usé el método O (log n) para calcular los números de Fibonacci.SPOJ Problema Flibonakki límite de tiempo excede
import Data.List
import Data.Maybe
import qualified Data.ByteString.Lazy.Char8 as BS
matmul :: [Integer] -> [Integer] -> Integer -> [Integer]
matmul [a,b,c] [d,e,f] m = [x,y,z] where
y = (a*e + b*f) `mod` m
z = (b*e + c*f) `mod` m
x = y + z
powM ::[Integer] -> Integer -> Integer -> [Integer]
powM a n m | n == 1 = a
| n == 2 = matmul a a m
| even n = powM (matmul a a m) (div n 2) m
| otherwise = matmul a (powM (matmul a a m) (div n 2) m) m
readInt :: BS.ByteString -> Integer
readInt = fst.fromJust.BS.readInteger
solve::Integer -> BS.ByteString
solve n = BS.pack.show $ mod (c*d) 1000000007 where
[c,d,_] = powM [1,1,0] (2*n) 1000000007
--([_,a,_]:_) = powM [[1,2,1],[0,5,3],[0,3,2]] n 1000000007
-- f_3+f_7+f_11+f_15 = f_2n*f_(2n+1)
main = BS.interact $ BS.unlines. map (solve.readInt) . tail . BS.lines
Al utilizar perfiles de tiempo, qué funciones están tomando la mayor parte del tiempo http: //book.realworldhaskell.org/read/profiling-and-optimization.html#id677833 –
Nadie ha resuelto este en Haskell, puede ser demasiado lento para esta pregunta. –
Tal vez un poco de memorando ayudaría. –