ls = readlines raise unless ls.size == 1 n = ls[0] raise unless n == "0\n" || n =~ /^[1-9][0-9]*$/ n = n.to_i raise unless 0 <= n && n <= 10**18 def f n n + 1 - (1 << n.to_i.to_s(2).count('1')) end p f n