import Data.Int stepA :: Int64 -> Int64 stepA x = x * 16807 `mod` 2147483647 stepB :: Int64 -> Int64 stepB x = x * 48271 `mod` 2147483647 toInt16 :: Int64 -> Int16 toInt16 = fromIntegral stepAB :: ((Int64, Int64), Int) -> ((Int64, Int64), Int) stepAB ((x, y), n) = ((stepA x, stepB y), if (toInt16 x) == (toInt16 y) then n + 1 else n) solve1' :: ((Int64, Int64), Int) -> Int -> ((Int64, Int64), Int) solve1' z 0 = z solve1' z m = let !w = stepAB z in let !m' = m - 1 in solve1' w m' solve1 :: (Int64, Int64) -> Int solve1 (x, y) = snd $ solve1' ((x, y), 0) 40000000 input :: (Int64, Int64) input = (783, 325) main = (putStrLn . show . solve1) input