#include using namespace std; #define INF_LL (int64)1e18 #define INF (int32)1e9 #define REP(i, n) for(int i = 0;i < (n);i++) #define FOR(i, a, b) for(int i = (a);i < (b);i++) #define all(x) x.begin(),x.end() #define fs first #define sc second using int32 = int_fast32_t; using uint32 = uint_fast32_t; using int64 = int_fast64_t; using uint64 = uint_fast64_t; using PII = pair; using PLL = pair; const double eps = 1e-10; templateinline void chmin(A &a, B b){if(a > b) a = b;} templateinline void chmax(A &a, B b){if(a < b) a = b;} using PDI = pair; const int64 mod = 1e9+7; int64 dp[64][2][2][2] = {}; int64 N; int64 dfs(int32 d=62, int32 tight=1, int32 zero=1, int32 sat=0){ if(d == -1) return sat; int64 &ret = dp[d][tight][zero][sat]; if(~ret) return ret; int32 lim = (tight ? (N >> d & 1) : 1); ret = 0; REP(i, lim+1){ REP(j, (zero ? lim+1 : 2)){ if(zero && (i < j || i+j == 2)) continue; ret += dfs(d-1, tight&(i == lim), zero&(i+j==0), sat|(!zero & i+j == 2)); ret %= mod; } } return ret; } int main(void){ cin >> N; memset(dp, -1, sizeof dp); cout << dfs() << endl; }