#include using namespace std; #include using mint = atcoder::modint1000000007; using ll = long long; using vl = vector; ll floor_sqrt(ll n) { ll l = 0, r = 1e9; while (r - l > 1) { ll x = (l + r) / 2; (x * x <= n ? l : r) = x; } return l; } vl eratosthenes_sieve(ll n) { vector f(n + 1, true); vl ps; ll p = 2; for (ll p = 2; p * p <= n; p++) { if (!f[p]) continue; for (ll q = p * p; q <= n; q += p) f[q] = false; } for (; p <= n; p++) if (f[p]) ps.push_back(p); return ps; } int main() { ll n; cin >> n; if (n > 1e8) return 0; mint ans = 1; const int W = 1000000; ll sq0 = floor_sqrt(n); vl ps = eratosthenes_sieve(sq0); for (auto p : ps) { mint v = 1; for (ll x = n; x;) v += x /= p; ans *= v; } for (ll l = sq0 + 1; l <= n; l += W) { ll r = min(n, l + W - 1); ll d = r - l + 1; ll sq = floor_sqrt(r); vl lpf(d, 0); for (auto p : ps) { if (p > sq) break; for (ll j = max(2ll, (l + p - 1) / p * p); j <= r; j += p) if (lpf[j - l] == 0) lpf[j - l] = p; } for (ll i = 0; i < d; i++) if (lpf[i] == 0 && i + l > 1) { ll p = lpf[i] = i + l; mint v = 1; for (ll x = n; x; ) v += x /= p; ans *= v; } } cout << ans.val() << "\n"; }