using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static long NN => long.Parse(ReadLine()); public static void Main() { Solve(); } static void Solve() { var n = NN; var len = 0; { var tmp = n; while (tmp > 0) { ++len; tmp >>= 1; } } var ans = 0L; var mod = 1_000_000_007; { for (var l = 0; l < len; ++l) { // 上からl桁目が1であるN以下の数の和 var dpc0 = 1L; var dpc1 = 0L; var dps0 = 0L; var dps1 = 0L; var dpn = 1L; var nzero = false; if (l == 0) { dpc0 = 0; } for (var i = 1; i < len; ++i) { var ni = (n >> (len - i - 1)) & 1; if (i == l) { if (ni == 0) { dpn = 0; nzero = true; } else dpn = (dpn * 2 + 1) % mod; dpc1 = (dpc0 + dpc1) % mod; dps1 = ((dps0 + dps1) * 2 + dpc1) % mod; dpc0 = 0; dps0 = 0; } else { var ndpc0 = (dpc0 + dpc1) % mod; var ndpc1 = (dpc0 + dpc1) % mod; var ndps0 = (dps0 + dps1) * 2 % mod; var ndps1 = ((dps0 + dps1) * 2 + ndpc1) % mod; if (!nzero && ni == 1) { ndpc0 = (ndpc0 + 1) % mod; ndps0 = (ndps0 + dpn * 2) % mod; } dpc0 = ndpc0; dpc1 = ndpc1; dps0 = ndps0; dps1 = ndps1; if (!nzero) dpn = (dpn * 2 + ni) % mod; } } ans = (ans + dps0 + dps1 + dpn) % mod; } } WriteLine(ans); } }