module Main where import System.Environment infix 8 :+ data Surd5 = !Integer :+ !Integer deriving (Eq, Show, Read) instance Num Surd5 where (a :+ b) + (c :+ d) = (a+c) :+ (b+d) (a :+ b) - (c :+ d) = (a-c) :+ (b-d) (a :+ b) * (c :+ d) = (a*c+b*d) :+ (a*d+(c+d)*b) negate (a :+ b) = (-a) :+ (-b) signum (a :+ b) = case signum a of 0 -> signum b :+ 0 1 -> case signum b of (-1) -> signum ((2*a-b)^2-5*b^2) :+ 0 _ -> 1 :+ 0 _ -> case signum b of 1 -> signum (5*b^2-(2*a-b)^2) :+ 0 _ -> (-1) :+ 0 abs s = signum s * s fromInteger n = n :+ 0 fib :: Integral a => a -> Integer fib n = let (a:+b) = (0:+1)^n in b main :: IO () main = getArgs >>= mapM_ (print . fib . read)