-------------------------------------------------------------------------------- -- https://blog.miz-ar.info/2019/01/fast-fibonacci/ -------------------------------------------------------------------------------- fastDoubling :: Int -> (Integer, Integer) fastDoubling 0 = (0, 1) fastDoubling 1 = (1, 1) fastDoubling i = let (a, b) = fastDoubling (i `quot` 2) in if even i then (a * (2 * b - a), a * a + b * b) else (a * a + b * b, b * (2 * a + b)) fib :: Int -> Integer fib i = case fastDoubling i of (a, _) -> a main :: IO () main = readLn >>= print . fib . succ