#include <bits/stdc++.h>
 
#ifndef LOCAL_
#define fprintf if( false ) fprintf
#endif // LOCAL_
#define dumpi(x1) fprintf(stderr, "#%s.%d (%s) = (%d)\n", __func__, __LINE__, #x1, x1);
#define dumpii(x1, x2) fprintf(stderr, "#%s.%d (%s, %s) = (%d, %d)\n", __func__, __LINE__, #x1, #x2, x1, x2);
#define dumpiii(x1, x2, x3) fprintf(stderr, "#%s.%d (%s, %s, %s) = (%d, %d, %d)\n", __func__, __LINE__, #x1, #x2, #x3, x1, x2, x3);
#define dumpl(x1) fprintf(stderr, "#%s.%d (%s) = (%ld)\n", __func__, __LINE__, #x1, x1);
#define dumpll(x1, x2) fprintf(stderr, "#%s.%d (%s, %s) = (%ld, %ld)\n", __func__, __LINE__, #x1, #x2, x1, x2);
#define dumpd(x1) fprintf(stderr, "#%s.%d (%s) = (%lf)\n", __func__, __LINE__, #x1, x1);
#define dumpdd(x1, x2) fprintf(stderr, "#%s.%d (%s, %s) = (%lf, %lf)\n", __func__, __LINE__, #x1, #x2, x1, x2);
#define loop for(;;)
 
struct S002 {
  int n;
  S002& operator > (long& x) {
    n = x;
    return *this;
  }
  S002& operator > (long&& x) {
    n = x;
    return *this;
  }
  S002& operator >= (long& x) {
    if( scanf("%ld", &x) <= 0 ) exit(0);
    return *this;
  }
  S002& operator >= (double& x) {
    if( scanf("%lf", &x) <= 0 ) exit(0);
    return *this;
  }
  S002& operator >= (std::string& s) {
    if( not (std::cin >> s) ) exit(0);
    return *this;
  }
  template<typename a>
  S002& operator >= (std::vector<a>& v) {
    v.resize(n);
    for(long i = 0; i < n; ++i) {
      *this >= v[i];
    }
    return *this;
  }
  template<typename a, std::size_t s>
  S002& operator >= (std::array<a, s>& x) {
    for(long i = 0; i < (long)s; ++i) {
      *this >= x[i];
    }
    return *this;
  }
};

template<typename a>
struct S009 {
  a pow(a x, long n) {
    if( n == 0 ) return a(1);
    a t = pow(x, n / 2);
    return t * t * (n % 2 ? x : a(1));
  }
};

template<long p = 1000000007>
struct S010 {
  long x;
  S010() : x(0) {}
  S010(long x_) : x(x_ % p) {}
  S010 operator + (S010 y) { return S010<p>((x + y.x) % p); }
  S010 operator += (S010 y) { x = (x + y.x) % p; return *this; }
  S010 operator - (S010 y) { return S010<p>((x - y.x) % p); }
  S010 operator -= (S010 y) { x = (x - y.x) % p; return *this; }
  S010 operator * (S010 y) { return S010<p>((x * y.x) % p); }
  S010 operator *= (S010 y) { x = (x * y.x) % p; return *this; }
  S010 operator / (S010 y) { S009<S010> s; return *this * s.f(x, p - 2); }
  S010 operator /= (S010 y) { S009<S010> s; x = (*this * pow(x, p - 2)); return *this; }
};
template<long p>
S002& operator >= (S002& r, S010<p>& x) {
  long y;
  r >= y;
  x = S010<p>(y);
  return r;
}

struct S018 {
  std::vector<std::pair<long, long>> xs;
  S018(long x) {
    for(long i = 2; i * i <= x; ++i) {
      long t = 0;
      while( x % i == 0 ) {
        t += 1;
        x /= i;
      }
      if( t == 0 ) continue;
      xs.push_back(std::make_pair(i, t));
    }
    if( x != 1 ) {
      xs.push_back(std::make_pair(x, 1));
    }
  }
  std::pair<long, long> operator [] (long i) {
    return xs[i];
  }
  typename std::vector<std::pair<long, long>>::iterator begin() {
    return xs.begin();
  }
  typename std::vector<std::pair<long, long>>::iterator end() {
    return xs.end();
  }
};

struct Solver {
  long n;
  Solver() {
    S002 r;
    r >= n;
  }
  void solve() {
    std::vector<long> xs(1024, 0);
    for(long i = 1; i <= n; ++i) {
      S018 s(i);
      for(std::pair<long, long> pt : s) {
        xs[pt.first] += pt.second;
      }
    }
    S010<> res(1);
    for(long t : xs) {
      res *= t + 1;
    }
    printf("%ld\n", res.x);
  }
};
 
int main() {
  for(;;) std::unique_ptr<Solver>(new Solver())->solve();
  return 0;
}

Measured memory_bytes: 256