#include <bits/stdc++.h>
using namespace std;
int dp[2][19 + 5][2 + 5];
int pow3[2] = {1, 3};
int log_2(int n) {
  int l = 1, r = 19;
  while (l < r) {
    int mid = (l + r + 1) >> 1;
    if ((1 << mid) <= n) {
      l = mid;
    } else {
      r = mid - 1;
    }
  }
  return l;
}
int main() {
  int n;
  int w;
  bool m = 0;
  scanf("%d", &n);
  w = log_2(n);
  if ((1 << (w - 1)) + (1 << w) <= n) {
    m = 1;
  }
  if (m) {
    dp[1][w][0] = 1;
    dp[1][w - 1][1] = 1;
  } else {
    dp[1][w][0] = 1;
  }
  for (int i = 2; i <= n; i++) {
    for (int j = w; j >= 0; j--) {
      dp[i & 1][j][0] = (dp[(i - 1) & 1][j][0] * 1LL *
                         (n / (1 << j) - (i - 1)) % 1000000007) %
                        1000000007;
      dp[i & 1][j][0] +=
          (dp[(i - 1) & 1][j + 1][0] * 1LL *
           (((n / ((1 << j)) - n / (((1 << (j + 1)))))) % 1000000007) %
           1000000007) %
          1000000007;
      dp[i & 1][j][0] %= 1000000007;
      dp[i & 1][j][0] +=
          (dp[(i - 1) & 1][j][1] * 1LL *
           (((n / (1 << j) - n / (((1 << (j)) * 3)))) % 1000000007) %
           1000000007) %
          1000000007;
      dp[i & 1][j][0] %= 1000000007;
      if (m) {
        dp[i & 1][j][1] = (dp[(i - 1) & 1][j][1] * 1LL *
                           (n / ((1 << j) * 3) - (i - 1)) % 1000000007) %
                          1000000007;
        dp[i & 1][j][1] +=
            (dp[(i - 1) & 1][j + 1][1] * 1LL *
             (((n / ((1 << j) * 3) - n / (((1 << (j + 1)) * 3)))) %
              1000000007) %
             1000000007) %
            1000000007;
        dp[i & 1][j][1] %= 1000000007;
      }
    }
  }
  printf("%d", dp[n & 1][0][0]);
}
