#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))
using namespace std;
const int inf=1e9+7;
const int N = 1e6 + 50;
namespace Moblus{
const int maxn = N;
bool check[maxn+10];
int prime[maxn+10];
int mu[maxn+10];
void Moblus(){
MEM(check,0);
mu[1]=1;
int tot=0;
for(int i=2;i<=maxn;++i){
if(!check[i]){
prime[tot++]=i;
mu[i]=-1;
}
for(int j=0;j<tot;++j){
if((ll)i*prime[j]>maxn){
break;
}
check[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}
else{
mu[i*prime[j]]=-mu[i];
}
}
}
}
}
ll g[N],t[N];
void getG(int n){//g[n]= sum(i/j向上取整)
for(int j=1;j<=n;++j){//枚舉j
for(int k=1,ed=n/j+(n%j>0);k<=ed;++k){//枚舉k,向上取整(i/j)=k
int a=(k-1)*j+1;//a/j=k
int b=(k*j+1);//b/j=k+1
a=min(max(a,j),n+1);//當a,b<j時,全部操作到j上,避免往前累加
b=min(max(b,j),n+1);
t[a]=(t[a]+k)%inf;
t[b]=(t[b]-k)%inf;
}
t[j]=(t[j]+t[j-1])%inf;
g[j]=t[j];//g[j]=t[1]+t[2]+..+t[j]
}
for(int i=1;i<=n;++i){
g[i]+=g[i-1];
g[i]%=inf;
}
}
ll ans[N];
void slove(int n){
Moblus::Moblus();
getG(n);
for(int i=1;i<=n;++i){
for(int j=i;j<=n;j+=i){
ans[j]+=Moblus::mu[i]*(g[j/i]-g[j/i-1])%inf;
ans[j]%=inf;
}
}
for(int i=1;i<=n;++i){
ans[i]=(ans[i]+ans[i-1])%inf;
}
}
int main()
{
//freopen("/home/lu/code/r.txt","r",stdin);
//freopen("/home/lu/code/w.txt","w",stdout);
slove(1e6+1);
int n;
while(~scanf("%d",&n)){
printf("%lld\n",(ans[n]+inf)%inf);
}
return 0;
}