#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7;
int n, k;
int a[33];
long long f[33][33][2], pw[33];
void upd(long long &a, long long b) {
  a += b;
  if (a >= P) a -= P;
}
void init() {
  pw[0] = 1;
  for (int i = (1); i < (33); i++) pw[i] = pw[i - 1] * 2 % P;
}
int main() {
  init();
  while (~scanf("%d", &k)) {
    n = 0;
    while (k) {
      a[++n] = (k & 1);
      k >>= 1;
    }
    for (int l = 1, r = n; l < r; ++l, --r) swap(a[l], a[r]);
    memset(f, 0, sizeof(f));
    f[0][0][1] = 1;
    for (int i = (0); i < (n); i++)
      for (int j = (0); j < (i + 1); j++) {
        if (f[i][j][0]) {
          upd(f[i + 1][j + 1][0], f[i][j][0]);
          upd(f[i + 1][j][0], f[i][j][0] * pw[j] % P);
        }
        if (f[i][j][1]) {
          if (a[i + 1]) upd(f[i + 1][j + 1][1], f[i][j][1]);
          if (a[i + 1])
            upd(f[i + 1][j][0], f[i][j][1] * (j ? pw[j - 1] : 1) % P);
          upd(f[i + 1][j][1], f[i][j][1] * (j ? pw[j - 1] : 0) % P);
        }
      }
    long long ans = 0;
    for (int i = (0); i < (n + 1); i++)
      for (int j = (0); j < (2); j++)
        if (f[n][i][j]) {
          upd(ans, f[n][i][j]);
        }
    printf("%lld\n", ans);
  }
  return 0;
}
