N=gets.to_i dp=Array.new(N+1,-1) Q=[[1,1]] until Q.empty? u,v=Q.shift next if u<1||u>N dp[u]=v ua=u+u.to_s(2).count('1') ub=u-u.to_s(2).count('1') Q.push([ua,v+1]) if dp[ua]==-1 && ua<=N Q.push([ub,v+1]) if dp[ub]==-1 && ub>=1 end puts dp[N]