let bit_n n = let rec doit n acc = if n = 0 then acc else doit (n / 2) (acc + n mod 2) in doit n 0 let bfs n = let t = Array.make (n + 1) (-1) in let q = Queue.create () in t.(1) <- 1; Queue.add 1 q; while not (Queue.is_empty q) do let m = Queue.pop q in if m = n then () else begin let i = bit_n m in let x, y = m + i, m - i in if x <= n && t.(x) = (-1) then begin t.(x) <- t.(m) + 1; Queue.add x q; end; if y > 0 && t.(y) = (-1) then begin t.(y) <- t.(m) + 1; Queue.add y q; end end done; t.(n) let () = read_int () |> bfs |> Printf.printf "%d\n"