Fox and Perfect Sets

Fox Ciel studies number theory.

She thinks a non-empty set S contains non-negative integers is perfect if and only if for any  ( a can be equal to b), . Where operation xor means exclusive or operation (http://en.wikipedia.org/wiki/Exclusive_or).

Please calculate the number of perfect sets consisting of integers not greater than k. The answer can be very large, so print it modulo 1000000007 (109 + 7).

Input

The first line contains an integer k (0 ≤ k ≤ 109).

Output

Print a single integer — the number of required sets modulo 1000000007 (109 + 7).

Examples

input

1

output

2

input

2

output

3

input

3

output

5

input

4

output

6

Note

In example 1, there are 2 such sets: {0} and {0, 1}. Note that {1} is not a perfect set since 1 xor 1 = 0 and {1} doesn’t contain zero.

In example 4, there are 6 such sets: {0}, {0, 1}, {0, 2}, {0, 3}, {0, 4} and {0, 1, 2, 3}.

Solution:

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <memory.h>

using namespace std;

const int md = 1000000007;

inline void add(int &a, int b) {
a += b;
if (a >= md) a -= md;
}

inline int mul(int a, int b) {
return 1LL * a * b % md;
}

const int N = 222;

int c[N][N];

int f[N][N][2];

int d[N];

int main() {
for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
      if (j == 0) c[i][j] = 1; else
      if (i < j) c[i][j] = 0; else {
        c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
        if (c[i][j] >= md) c[i][j] -= md;
}
int k;
scanf("%d", &k);
for (int j = 0; j < 30; j++)
    if (k & (1 << j)) d[j] = 1;
    else d[j] = 0;
  memset(f, 0, sizeof(f));
  f[30][0][1] = 1;
  for (int j = 30; j > 0; j--)
for (int open = 0; open <= 30 - j; open++)
      for (int eq = 0; eq <= 1; eq++) {
        int ft = f[j][open][eq];
        if (ft == 0) {
          continue;
        }
        if (eq == 0 || d[j - 1] == 1) {
          add(f[j - 1][open + 1][eq], ft);
        }
        for (int u = 0; u <= open; u++)
          if (u & 1) {
            if (eq == 0 || d[j - 1] == 1) {
              add(f[j - 1][open][eq], mul(ft, c[open][u]));
            }
          } else {
            int neq = eq;
            if (d[j - 1] == 1) neq = 0;
            add(f[j - 1][open][neq], mul(ft, c[open][u]));
          }
      }
  int ans = 0;
  for (int open = 0; open <= 30; open++)
    for (int eq = 0; eq <= 1; eq++)
      add(ans, f[0][open][eq]);
  printf("%d\n", ans);
  return 0;
}