#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
ll mul(ll a, ll b) { return ((a % mod) * (b % mod)) % mod; }
ll pow_mod(ll a, ll b){
ll ret = 1;
while (b){
if (b & 1) ret = mul(ret, a);
a = mul(a, a);
b /= 2;
}
return ret;
}
ll Inv(ll x) { return pow_mod(x, mod - 2); }
int get_power(int n, int p) {
int res = 0;
for (int div = p; div <= n; div *= p)
res += n / div;
return res;
}
ll g(ll n) {
return mul(mul(n, (n + 1)), Inv(2));
}
vector<int> sieve(int n) {
vector<bool> p(n + 1, true);
vector<int> result;
p[0] = p[1] = false;
for (int i = 2; i * i <= n; ++i) {
if (p[i]) {
for (int j = i * i; j <= n; j += i)
p[j] = false;
}
}
for (int i = 2; i <= n; ++i)
if (p[i]) result.emplace_back(i);
return result;
}
int main() { ios::sync_with_stdio(false); cin.tie(nullptr);
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int tc = 1;
// cin >> tc;
int n;
vector<int> primes = sieve(1e6 + 1);
cont: while(cin >> n) {
if(n == 0) return 0;
ll ans = 1;
for(auto& p : primes){
if(p > n) break;
int pw = get_power(n, p);
ans = mul(ans, g(pw + 1));
}
cout << ans <<'\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwpjb25zdCBsbCBtb2QgPSAxZTkgKyA3OwpsbCBtdWwobGwgYSwgbGwgYikgeyByZXR1cm4gKChhICUgbW9kKSAqIChiICUgbW9kKSkgJSBtb2Q7IH0KbGwgcG93X21vZChsbCBhLCBsbCBiKXsKICAgIGxsIHJldCA9IDE7CiAgICB3aGlsZSAoYil7CiAgICAgICAgaWYgKGIgJiAxKSByZXQgPSBtdWwocmV0LCBhKTsKICAgICAgICBhID0gbXVsKGEsIGEpOwogICAgICAgIGIgLz0gMjsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KbGwgSW52KGxsIHgpIHsgcmV0dXJuIHBvd19tb2QoeCwgbW9kIC0gMik7IH0KaW50IGdldF9wb3dlcihpbnQgbiwgaW50IHApIHsKICAgIGludCByZXMgPSAwOwogICAgZm9yIChpbnQgZGl2ID0gcDsgZGl2IDw9IG47IGRpdiAqPSBwKQogICAgICAgIHJlcyArPSBuIC8gZGl2OwogICAgcmV0dXJuIHJlczsKfQpsbCBnKGxsIG4pIHsKICAgIHJldHVybiBtdWwobXVsKG4sIChuICsgMSkpLCBJbnYoMikpOwp9CnZlY3RvcjxpbnQ+IHNpZXZlKGludCBuKSB7CiAgICB2ZWN0b3I8Ym9vbD4gcChuICsgMSwgdHJ1ZSk7CiAgICB2ZWN0b3I8aW50PiByZXN1bHQ7CiAgICBwWzBdID0gcFsxXSA9IGZhbHNlOwogICAgZm9yIChpbnQgaSA9IDI7IGkgKiBpIDw9IG47ICsraSkgewogICAgICAgIGlmIChwW2ldKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSBpICogaTsgaiA8PSBuOyBqICs9IGkpCiAgICAgICAgICAgICAgICBwW2pdID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbjsgKytpKQogICAgICAgIGlmIChwW2ldKSByZXN1bHQuZW1wbGFjZV9iYWNrKGkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQppbnQgbWFpbigpIHsgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKG51bGxwdHIpOwojaWZuZGVmIE9OTElORV9KVURHRQogICAgZnJlb3BlbigiaW4udHh0IiwgInIiLCBzdGRpbik7CiNlbmRpZgogICAgaW50IHRjID0gMTsKICAgIC8vIGNpbiA+PiB0YzsKICAgIGludCBuOwogICAgdmVjdG9yPGludD4gcHJpbWVzID0gc2lldmUoMWU2ICsgMSk7CiAgICBjb250OiB3aGlsZShjaW4gPj4gbikgewogICAgICAgIGlmKG4gPT0gMCkgcmV0dXJuIDA7CiAgICAgICAgbGwgYW5zID0gMTsKICAgICAgICBmb3IoYXV0byYgcCA6IHByaW1lcyl7CiAgICAgICAgICAgIGlmKHAgPiBuKSBicmVhazsKICAgICAgICAgICAgaW50IHB3ID0gZ2V0X3Bvd2VyKG4sIHApOwogICAgICAgICAgICBhbnMgPSBtdWwoYW5zLCBnKHB3ICsgMSkpOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8IGFucyA8PCdcbic7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==