n = gets.to_i arr = (1..n).to_a.map { |i| i.digits(2).count(1) } INF = 10000000 ans = [INF] * n ans[0] = 1 que = [] # queueの中身は[現在のマス, 移動数] que.unshift([0, 1]) while !que.empty? index, move_count = que.pop() if index == n-1 puts move_count exit 0 end if index + arr[index] <= n - 1 && move_count + 1 < ans[index + arr[index]] que.unshift([index + arr[index], move_count + 1]) ans[index + arr[index]] = move_count + 1 end if index - arr[index] >= 0 && move_count + 1 < ans[index - arr[index]] que.unshift([index - arr[index], move_count + 1]) ans[index + arr[index]] = move_count + 1 end end puts -1