MOD = 10**9 + 7 def main(): N = int(input().strip()) max_k = 60 pow3 = [1] * (max_k + 1) for i in range(1, max_k + 1): pow3[i] = (pow3[i-1] * 3) % MOD def pow_mod(a, b): res = 1 while b > 0: if b % 2 == 1: res = res * a % MOD a = a * a % MOD b //= 2 return res def compute_sum(m, k): s = bin(m)[2:] bits = list(map(int, s.zfill(k))) L = len(bits) memo = {} def dfs(pos, tight, cnt): if pos == L: return pow(2, k - cnt, MOD) key = (pos, tight, cnt) if key in memo: return memo[key] res = 0 limit = bits[pos] if tight else 1 for b in range(0, limit + 1): new_tight = tight and (b == limit) new_cnt = cnt + (b == 1) if new_tight: res += dfs(pos + 1, new_tight, new_cnt) else: remaining = L - pos - 1 term = pow(3, remaining, MOD) * pow(2, k - new_cnt - remaining, MOD) % MOD res += term res %= MOD memo[key] = res % MOD return res % MOD total = dfs(0, True, 0) return total % MOD ans = 0 for k in range(max_k + 1): y_min = 1 << k if y_min > N: continue d_max = N - y_min if d_max < 0: continue if (1 << k) - 1 <= d_max: sum_val = pow3[k] possible_d = (1 << k) else: sum_val = compute_sum(d_max, k) possible_d = d_max + 1 term = (possible_d % MOD) * pow_mod(2, k) % MOD term = (term - sum_val) % MOD ans = (ans + term) % MOD print(ans % MOD) if __name__ == '__main__': main()