import Prelude import Data.Bits (popCount) import qualified Data.Set as Set main :: IO () main = readLn >>= print . solve solve :: Int -> Int solve n = solve' [1] [] 1 Set.empty where -- Breadth First Search -- Searching Nodes -> Next Search Nodes -> Count -> Node Logs solve' :: [Int] -> [Int] -> Int -> Set.Set Int -> Int solve' [] [] _ _ = -1 solve' [] nx c st = solve' nx [] (c + 1) st solve' (b:bs) nx c st | b < 1 || b > n || Set.member b st = solve' bs nx c st | b == n = c | otherwise = let x = popCount b in solve' bs ((b + x):((b - x):nx)) c (Set.insert b st)