import Data.Bits import Data.Maybe solve :: [(Int, Int)] -> [Int] -> Int -> Int solve flag [] n = case (lookup n flag) of Just x -> x Nothing -> -1 solve flag (q:queue) n = solve flag' queue' n where qb = popCount q inc = q + qb dec = q - qb isInc = inc <= n && isNothing (lookup inc flag) isDec = dec > 0 && isNothing (lookup dec flag) flag' | isInc && isDec = flag ++ [(inc, fromJust (lookup q flag) + 1)] ++ [(dec, fromJust (lookup q flag) + 1)] | isInc = flag ++ [(inc, fromJust (lookup q flag) + 1)] | isDec = flag ++ [(dec, fromJust (lookup q flag) + 1)] | otherwise = flag queue' | isInc && isDec = queue ++ [inc] ++ [dec] | isInc = queue ++ [inc] | isDec = queue ++ [dec] | otherwise = queue main = do --n <- (read :: String -> Int) <$> getLine n <- readLn print $ solve [(0, 0), (1, 1)] [1] n