#include using namespace std; #define INF_LL (int64)1e18 #define INF (int32)1e9 #define REP(i, n) for(int64 i = 0;i < (n);i++) #define FOR(i, a, b) for(int64 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;} const int64 mod = 1e9+7; int64 N; vector bit; int64 sum[70][70][2], cnt[70][70][2]; PLL dfs(int32 rest, int32 dig = 0, bool tight = 1){ if(dig == bit.size()) return PLL(0, rest == 0); int64 &rets = sum[rest][dig][tight], &retc = cnt[rest][dig][tight]; if(~rets) return PLL(rets, retc); rets = 0; retc = 0; int32 lim = tight ? bit[dig] : 1; int64 val = (1LL << (bit.size()-dig-1))%mod; REP(i, lim+1){ if(i > rest) continue; PLL x = dfs(rest-(i == 1), dig+1, tight && i == lim); retc = (retc+x.sc)%mod; rets = (rets+x.fs+x.sc*val*(i==1)%mod)%mod; } return PLL(rets, retc); } int main(void){ cin >> N; memset(sum, -1, sizeof sum); memset(cnt, -1, sizeof cnt); while(N){ bit.push_back(N&1); N >>= 1; } reverse(all(bit)); int64 res = 0; FOR(i, 1, bit.size()+1){ res += dfs(i).fs*i%mod; res %= mod; } cout << res << endl; }