MOD = 998244353i64 n = read_line.to_i64 ans = 0i64 60.times do |pos| dp = Array.new(2) { Array.new(61, 0i64) } dp[1][0] = 1 59.downto(0) do |i| dp2 = Array.new(2) { Array.new(61, 0i64) } 0.upto(60) do |j| dp2[0][j] += dp[0][j] if i != pos dp2[0][j + 1] += dp[0][j] if j + 1 < dp2[0].size if n.bit(i) == 0 dp2[1][j] += dp[1][j] if i != pos else dp2[0][j] += dp[1][j] if i != pos dp2[1][j + 1] += dp[1][j] if j + 1 < dp2[0].size end end 0.upto(60) do |j| dp2[0][j] %= MOD dp2[1][j] %= MOD end dp = dp2 end base = (1i64 << pos) % MOD 60.times do |i| cnt = dp[0][i] + dp[1][i] cnt = (cnt * (cnt - 1) // 2 + cnt) % MOD ans += base * cnt ans %= MOD end end puts ans