(X-N!)(Y-N!) = (N!)^2
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=1000005;
int prime[N],vst[N],num;
inline void Pre(int maxn){
for (int i=2;i<=maxn;i++){
if (!vst[i]) prime[++num]=i;
for (int j=1;j<=num && (ll)prime[j]*i<=maxn;j++){
vst[prime[j]*i]=1;
if (i%prime[j]==0)
break;
}
}
}
int n;
int q[N];
ll ans=1;
const int P=1e9+7;
const int INV=5e8+4;
int main(){
scanf("%d",&n); Pre(n);
for (int i=1;i<=num;i++){
int tem=prime[i];
q[i]=n/tem;
while ((ll)tem*prime[i]<=n)
tem*=prime[i],q[i]+=n/tem;
(ans*=(2*q[i]+1))%=P;
}
printf("%lld\n",((ans+P-1)%P*INV%P+1)%P);
return 0;
}