#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define pb push_back
const int N=1e6+50,mod=10000007;
int prim[N],vis[N],it,dp[N];
int ansVis[N];
int ansdp[N];
unordered_map<int,int> mp(N);
vector<int> vect;
void sieve(){
for (int i=2;i*i<N;i++){
if (!prim[i]){
for (int j=i+i;j<N;j+=i)
prim[j]=i;
}
}
for (int i=2;i<N;i++){
if (!prim[i]){
prim[i]=i;
vect.pb(i);
}
}
return;
}
ll solve(int ind){
if (ind==-1)
return 1;
if (vis[ind]==it)
return dp[ind];
ll ret=0;
for (long long i=0;i<=mp[vect[ind]];i++){
ret+=solve(ind-1)*(i+1);
if(ret>mod)
ret%=mod;
}
dp[ind]=ret;
vis[ind]=it;
return ret;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
sieve();
int n,x;
while(cin>>n && n){
if(ansVis[n]){
cout<<ansdp[n]<<"\n";
continue;
}
mp.clear();
for (int i=1;i<=n;i++){
x=i;
while(prim[x]){
mp[prim[x]]++;
x/=prim[x];
}
}
ll ans=0;
int siz=vect.size();
it++;
for (int i=30000; i<siz+29999;i+=30000){
ans=solve(min(i,siz-1));
}
ansVis[n]=1;
ansdp[n]=ans;
cout<<ans<<"\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAp0eXBlZGVmICBsb25nIGxvbmcgbGw7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CiAKI2RlZmluZSBwYiBwdXNoX2JhY2sKIApjb25zdCBpbnQgTj0xZTYrNTAsbW9kPTEwMDAwMDA3OwppbnQgcHJpbVtOXSx2aXNbTl0saXQsZHBbTl07CmludCBhbnNWaXNbTl07CmludCBhbnNkcFtOXTsKdW5vcmRlcmVkX21hcDxpbnQsaW50PiBtcChOKTsKdmVjdG9yPGludD4gdmVjdDsKIAp2b2lkIHNpZXZlKCl7CiAgICBmb3IgKGludCBpPTI7aSppPE47aSsrKXsKICAgICAgICBpZiAoIXByaW1baV0pewogICAgICAgICAgICBmb3IgKGludCBqPWkraTtqPE47ais9aSkKICAgICAgICAgICAgICAgIHByaW1bal09aTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpPTI7aTxOO2krKyl7CiAgICAgICAgaWYgKCFwcmltW2ldKXsKICAgICAgICAgICAgcHJpbVtpXT1pOwogICAgICAgICAgICB2ZWN0LnBiKGkpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQogCmxsIHNvbHZlKGludCBpbmQpewogICAgaWYgKGluZD09LTEpCiAgICAgICAgcmV0dXJuIDE7CiAgICBpZiAodmlzW2luZF09PWl0KQogICAgICAgIHJldHVybiBkcFtpbmRdOwogICAgbGwgcmV0PTA7CiAgICBmb3IgKGxvbmcgbG9uZyBpPTA7aTw9bXBbdmVjdFtpbmRdXTtpKyspewogICAgICAgIHJldCs9c29sdmUoaW5kLTEpKihpKzEpOwogICAgICAgIGlmKHJldD5tb2QpCiAgICAgICAgICByZXQlPW1vZDsKICAgIH0KICAgIGRwW2luZF09cmV0OwogICAgdmlzW2luZF09aXQ7CiAgICByZXR1cm4gcmV0Owp9CiAKaW50IG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgc2lldmUoKTsKICAgIGludCBuLHg7CiAgICB3aGlsZShjaW4+Pm4gJiYgbil7CiAgICAgICAgaWYoYW5zVmlzW25dKXsKICAgICAgICAgICAgY291dDw8YW5zZHBbbl08PCJcbiI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBtcC5jbGVhcigpOwogICAgICAgIGZvciAoaW50IGk9MTtpPD1uO2krKyl7CiAgICAgICAgICAgIHg9aTsKICAgICAgICAgICAgd2hpbGUocHJpbVt4XSl7CiAgICAgICAgICAgICAgICBtcFtwcmltW3hdXSsrOwogICAgICAgICAgICAgICAgeC89cHJpbVt4XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsbCBhbnM9MDsKICAgICAgICBpbnQgc2l6PXZlY3Quc2l6ZSgpOwogICAgICAgIGl0Kys7CiAgICAgICAgZm9yIChpbnQgaT0zMDAwMDsgaTxzaXorMjk5OTk7aSs9MzAwMDApewogICAgICAgICAgICBhbnM9c29sdmUobWluKGksc2l6LTEpKTsKICAgICAgICB9CiAgICAgICAgYW5zVmlzW25dPTE7CiAgICAgICAgYW5zZHBbbl09YW5zOwogICAgICAgIGNvdXQ8PGFuczw8IlxuIjsKICAgIH0KICAgIHJldHVybiAwOwp9