#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
using namespace chrono;
using ull = unsigned long long;
auto start = high_resolution_clock::now();
void Code_By_Mohamed_Khaled() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
}
void Time() {
#ifndef ONLINE_JUDGE
cout<<"\n";
auto end = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(end - start);
cout << "Time taken: " << duration.count() << " microseconds" << endl;
#endif
}
const ll mod = 1e7+ 7;
ll add(ll a, ll b) { return ((a % mod) + (b % mod)) % mod; }
ll mul(ll a, ll b) { return ((a%mod)*(b%mod)) % mod; }
ll sub(ll a, ll b) { return ((a % mod) - (b % mod) + mod) % mod; }
ll N=1e6;
vector<bool>is_prime(N+1,false);
vector<int>primes;
void Linear_Sieve() {
for (ll i=2;i<=N;i++) {
if (!is_prime[i])primes.push_back(i);
for (ll j=0;j<primes.size() and primes[j]*i<=N;j++) {
is_prime[primes[j]*i]=true;
if (i%primes[j]==0)break;
}
}
}
ll inv=(mod+1)/2;
int main() {
Code_By_Mohamed_Khaled();
Linear_Sieve();
ll t;
while (cin>>t and t>0) {
ll n;n=t;ll ans=1;
for (auto it:primes) {
if (n<it)break;
ll cnt=0;ll temp=n;
while (temp>0) {
cnt+=temp/it;
temp=temp/it;
}
ans=mul(ans,mul(cnt+1,cnt+2))*inv%mod;
}
cout<<ans<<"\n";
}
Time();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgY2hyb25vOwp1c2luZyB1bGwgPSB1bnNpZ25lZCBsb25nIGxvbmc7CmF1dG8gc3RhcnQgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwp2b2lkIENvZGVfQnlfTW9oYW1lZF9LaGFsZWQoKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBjb3V0LnRpZShudWxscHRyKTsKI2lmbmRlZiBPTkxJTkVfSlVER0UKICAgIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogICAgZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKI2VuZGlmCn0Kdm9pZCBUaW1lKCkgewojaWZuZGVmIE9OTElORV9KVURHRQogICAgY291dDw8IlxuIjsKICAgIGF1dG8gZW5kID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgIGF1dG8gZHVyYXRpb24gPSBkdXJhdGlvbl9jYXN0PG1pY3Jvc2Vjb25kcz4oZW5kIC0gc3RhcnQpOwogICAgY291dCA8PCAiVGltZSB0YWtlbjogIiA8PCBkdXJhdGlvbi5jb3VudCgpIDw8ICIgbWljcm9zZWNvbmRzIiA8PCBlbmRsOwojZW5kaWYKfQpjb25zdCBsbCBtb2QgPSAxZTcrIDc7CmxsIGFkZChsbCBhLCBsbCBiKSB7IHJldHVybiAoKGEgJSBtb2QpICsgKGIgJSBtb2QpKSAlIG1vZDsgfQpsbCBtdWwobGwgYSwgbGwgYikgeyByZXR1cm4gKChhJW1vZCkqKGIlbW9kKSkgJSBtb2Q7IH0KbGwgc3ViKGxsIGEsIGxsIGIpIHsgcmV0dXJuICgoYSAlIG1vZCkgLSAoYiAlIG1vZCkgKyBtb2QpICUgbW9kOyB9CmxsIE49MWU2Owp2ZWN0b3I8Ym9vbD5pc19wcmltZShOKzEsZmFsc2UpOwp2ZWN0b3I8aW50PnByaW1lczsKdm9pZCBMaW5lYXJfU2lldmUoKSB7CiAgICBmb3IgKGxsIGk9MjtpPD1OO2krKykgewogICAgICAgIGlmICghaXNfcHJpbWVbaV0pcHJpbWVzLnB1c2hfYmFjayhpKTsKICAgICAgICBmb3IgKGxsIGo9MDtqPHByaW1lcy5zaXplKCkgYW5kIHByaW1lc1tqXSppPD1OO2orKykgewogICAgICAgICAgICBpc19wcmltZVtwcmltZXNbal0qaV09dHJ1ZTsKICAgICAgICAgICAgaWYgKGklcHJpbWVzW2pdPT0wKWJyZWFrOwogICAgICAgIH0KICAgIH0KfQpsbCBpbnY9KG1vZCsxKS8yOwppbnQgbWFpbigpIHsKICAgIENvZGVfQnlfTW9oYW1lZF9LaGFsZWQoKTsKICAgIExpbmVhcl9TaWV2ZSgpOwogICAgbGwgdDsKICAgIHdoaWxlIChjaW4+PnQgYW5kIHQ+MCkgewogICAgICAgIGxsIG47bj10O2xsIGFucz0xOwogICAgICAgIGZvciAoYXV0byBpdDpwcmltZXMpIHsKICAgICAgICAgICAgaWYgKG48aXQpYnJlYWs7CiAgICAgICAgICAgIGxsIGNudD0wO2xsIHRlbXA9bjsKICAgICAgICAgICAgd2hpbGUgKHRlbXA+MCkgewogICAgICAgICAgICAgICAgY250Kz10ZW1wL2l0OwogICAgICAgICAgICAgICAgdGVtcD10ZW1wL2l0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFucz1tdWwoYW5zLG11bChjbnQrMSxjbnQrMikpKmludiVtb2Q7CiAgICAgICAgfQogICAgICAgIGNvdXQ8PGFuczw8IlxuIjsKICAgIH0KICAgIFRpbWUoKTsKICAgIHJldHVybiAwOwp9