
int prime[maxn];
int vis[maxn];
int euler_sieve(int n) {
int cnt = 0;
vis[1] = 1;
for (int i = 2; i <= n; i++) {
if (!vis[i]) prime[cnt++] = i;
for (int j = 0; j < cnt; j++) {
if (i * prime[j] > n) break;
vis[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
return cnt;
}
int main() {
int cnt = euler_sieve(1000002);
unordered_map<int, ll> mp;
int n = readint();
for (int i = 1; i <= n; i++){
if (!vis[i]) {
mp[i]++;
continue;
}
ll tmp = i;
for (int j = 0; j < cnt && (ll)prime[j] * prime[j] <= tmp; j++) {
if (tmp % prime[j] == 0) while (tmp % prime[j] == 0) mp[prime[j]]++, tmp /= prime[j];
}
if (tmp > 1) mp[tmp]++;
}
ll res = 1ll;
for (auto it = mp.begin(); it != mp.end(); it++)
res = res * ((1ll + 2 * it->second) % MOD) % MOD;
Put(res);
}