N = gets.to_i dp = Array.new(N+1) dp[0], dp[1] = 0, 1 def move(dp, from) dist = from.to_s(2).count('1') if from + dist <= N && dp[from + dist] == nil dp[from + dist] = dp[from] + 1 dp = move(dp, from + dist) end if from - dist >= 0 && dp[from - dist] == nil dp[from - dist] = dp[from] + 1 dp = move(dp, from - dist) end return dp end dp = move(dp, 1) p dp[-1]