#include <bits/stdc++.h>
template <typename Tp>
void in(Tp &x) {
  char ch = getchar(), f = 1;
  x = 0;
  while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-') f = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
template <typename Tp>
bool chkmax(Tp &x, Tp y) {
  return x > y ? 0 : (x = y, 1);
}
template <typename Tp>
bool chkmin(Tp &x, Tp y) {
  return x < y ? 0 : (x = y, 1);
}
template <typename Tp>
Tp Max(Tp x, Tp y) {
  return x > y ? x : y;
}
template <typename Tp>
Tp Min(Tp x, Tp y) {
  return x < y ? x : y;
}
const int MOD = 1000000007;
const int MAXN = 40;
int n, f[MAXN][MAXN][2];
inline void update(int &x, int y) {
  if ((x += y) >= MOD) x -= MOD;
}
int power(int x, int y) {
  if (y == -1) return 1;
  int ret = 1;
  while (y) {
    if (y & 1) ret = 1ll * ret * x % MOD;
    x = 1ll * x * x % MOD;
    y >>= 1;
  }
  return ret;
}
int main() {
  in(n);
  f[32][0][1] = 1;
  for (int i = (31), i_END_ = (1); i >= i_END_; i--)
    for (int j = (0), j_END_ = (32 - i); j <= j_END_; j++) {
      if (n >> (i - 1) & 1) {
        if (j) update(f[i][j][0], f[i + 1][j - 1][0]);
        if (j) update(f[i][j][1], f[i + 1][j - 1][1]);
        update(f[i][j][0], 1ll * f[i + 1][j][0] * power(2, j) % MOD);
        update(f[i][j][0], 1ll * f[i + 1][j][1] * power(2, j - 1) % MOD);
        if (j) update(f[i][j][1], 1ll * f[i + 1][j][1] * power(2, j - 1) % MOD);
      } else {
        if (j) update(f[i][j][0], f[i + 1][j - 1][0]);
        update(f[i][j][0], 1ll * f[i + 1][j][0] * power(2, j) % MOD);
        update(f[i][j][1], 1ll * f[i + 1][j][1] * power(2, j - 1) % MOD);
      }
    }
  int ans = 0;
  for (int i = (0), i_END_ = (31); i <= i_END_; i++) {
    update(ans, f[1][i][0]);
    update(ans, f[1][i][1]);
  }
  printf("%d\n", ans);
  return 0;
}
