template<typename T> inlinevoidread(T &x){ x = 0; T k = 1; char in = getchar(); while (!isdigit(in)) { if (in == '-') k = -1; in = getchar(); } while (isdigit(in)) x = x * 10 + in - '0', in = getchar(); x *= k; }
typedeflonglong ll;
constint N = 1e6 + 5; constint MOD = 1e9 + 7;
ll n, ans; int cnt[N], g[N]; bool vis[N]; vector<int> pri;
inlinevoidmake_prime(){ for (int i = 2; i <= n; ++i) { if (!vis[i]) pri.push_back(i), g[i] = pri.size() - 1; for (int j = 0; j < pri.size() && i * pri[j] <= n; ++j) { vis[i*pri[j]] = true; g[i*pri[j]] = j; if (i % pri[j] == 0) break; } } }
intmain(){ read(n); make_prime(); for (int i = 2; i <= n; ++i) { int x = i; while (x != 1) cnt[g[x]]++, x /= pri[g[x]]; } ans = 1; for (int i = 0; i <= pri.size(); ++i) if (cnt[i]) ans = (ans * (cnt[i] * 2 + 1)) % MOD; printf("%lld\n", ans); return0; }