N = gets.to_i INF = 10**10 dp = Array.new(N+1){ INF } dp[0], dp[1] = 0, 1 def move(dp, from) dist = from.to_s(2).count('1') # ++ if from + dist <= N if dp[from + dist] > dp[from] + 1 dp[from + dist] = dp[from] + 1 dp = move(dp, from + dist) end end # -- if from - dist >= 0 if dp[from - dist] > dp[from] + 1 dp[from - dist] = dp[from] + 1 dp = move(dp, from - dist) end end return dp end dp = move(dp, 1) if dp[-1] == INF puts -1 else puts dp[-1] end