#include <bits/stdc++.h>
const long long N = 3e3 + 10;
const long long mod = 1e9 + 7;
using namespace std;
template <typename tp>
inline void read(tp &x) {
  x = 0;
  char c = getchar();
  bool f = 0;
  for (; c < '0' || c > '9'; f |= (c == '-'), c = getchar())
    ;
  for (; c >= '0' && c <= '9'; x = (x << 3) + (x << 1) + c - '0', c = getchar())
    ;
  if (f) x = -x;
}
long long n, ans;
long long x[34][34][5];
void add(long long &a, long long b) {
  a += b;
  while (a >= mod) a -= mod;
}
signed main() {
  read(n);
  x[32][0][1] = 1;
  for (long long i = 32; i >= 1; i--)
    for (long long j = 0; j <= 32; j++) {
      add(x[i - 1][j][0], (1LL << j) * x[i][j][0] % mod);
      add(x[i - 1][j + 1][0], x[i][j][0] % mod);
      if ((n >> (i - 1)) & 1) {
        add(x[i - 1][j][1], (j ? (1 << j - 1) : 0) * x[i][j][1] % mod);
        add(x[i - 1][j][0], (j ? (1 << j - 1) : 1) * x[i][j][1] % mod);
        add(x[i - 1][j + 1][1], x[i][j][1]);
      } else
        add(x[i - 1][j][1], (j ? (1 << j - 1) : 1) * x[i][j][1] % mod);
    }
  for (long long i = 0; i <= 32; i++) add(ans, (x[0][i][0] + x[0][i][1]) % mod);
  printf("%lld\n", ans);
  return 0;
}
