#include<bits/extc++.h>
#define LL long long
#define P pair<int,int>
#define fi first
#define se second
#define vec vector<int>
#define fr(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
using namespace std;
using namespace __gnu_pbds;
using u64=unsigned long long;
const int N=2e6+5;
mt19937_64 rnd(time(0));
namespace get
{
const int N=15,mod=1e9+7;
int n,m,p[N],C[N][N],inv[N],a[N],b[N];
vector<P> f,g,h;
inline int md(int x){return x>=mod?x-mod:x;}
inline int pw(int x,int y){return (y&1)?mod-x:x;}
inline int ksm(int x,int p){int s=1;for(;p;(p&1)&&(s=1ll*s*x%mod),x=1ll*x*x%mod,p>>=1);return s;}
void dfs(int x,int L,int s,int sz)
{
if(x==L) return h.push_back({s,sz});
dfs(x+1,L,s,sz);dfs(x+1,L,s+p[x],sz+1);
}
inline void init()
{
for(int i=C[0][0]=1;i<=12;i++)
{
C[i][0]=1;
for(int j=1;j<=i;j++) C[i][j]=md(C[i-1][j]+C[i-1][j-1]);
}inv[0]=inv[1]=1;
for(int i=2;i<=12;i++) inv[i]=mod-1ll*inv[mod%i]*(mod/i)%mod;
for(int i=1;i<=12;i++) inv[i]=1ll*inv[i]*inv[i-1]%mod;
}
inline int sol(vec K)
{
n=K.size();m=0;int ans=0;
for(int i=0;i<n;i++) p[i]=K[i]+1,m+=p[i]+1;m=m/2-1;
memset(a,0,sizeof(a));a[0]=1;
for(int i=0;i<n-1;i++)
{
int t=m-i;memcpy(b,a,sizeof(a));
for(int j=0;j<n;j++) a[j]=1ll*t*a[j]%mod;
for(int j=1;j<n;j++) a[j]=md(a[j]+mod-b[j-1]);
}
for(int i=0;i<n;i++) a[i]=1ll*a[i]*inv[n-1]%mod;
h.clear();dfs(0,n/2,0,0);f=h;
h.clear();dfs(n/2,n,0,0);g=h;
sort(f.begin(),f.end(),greater<P>());sort(g.begin(),g.end());
for(int A=0;A<n;A++) for(int B=0;B<=A;B++)
{
int s=0,j=0,S=0;
for(auto [i,u]:f)
{
while(j<g.size()&&i+g[j].fi<=m) S=md(S+pw(ksm(g[j].fi,A-B),g[j].se)),j++;
s=(s+1ll*pw(ksm(i,B),u)*S)%mod;
}ans=(ans+1ll*a[A]*C[A][B]%mod*s)%mod;
}
return ans;
}
}using get::sol;
LL n,to[N],g[N];int pr[N/10],cnt,m,tot;
u64 inv[N];
__inline LL div(LL x,int y){return x/y;}
__inline int TO(LL x){return x<=m?x:tot-(n/x)+1;}
inline void min_25_init()
{
m=sqrtl(n);
for(int i=1;i<=m;i++) inv[i]=~0ull/i+1;
for(LL i=1,t=n;i<=n;i=n/t+1,t=n/i) to[++tot]=n/t,g[tot]=to[tot]-1;
for(int i=2;i<=m;i++) if(g[i]^g[i-1])
{
pr[++cnt]=i;
for(int j=tot,t=TO(div(to[j],i));t>=i;t=TO(div(to[--j],i)))
g[j]+=(g[i-1]-g[t]);
}
}
u64 hs[105];
gp_hash_table<u64,LL>mp;
gp_hash_table<u64,vec>mp1;
vec K;
inline u64 upd(u64 v)
{
if(mp1.find(v)==mp1.end()) mp1[v]=K;
return v;
}
#define sq __builtin_sqrtl
inline void dfs(int x,LL S,u64 v)
{
if(x>cnt||(__int128)pr[x]*pr[x]*pr[x]*S>n)
{
LL m=n/S,t=g[TO(m)];int U=sq(m);
if(t>=x) K.push_back(1),mp[upd(v+hs[1])]+=t-x+1,K.pop_back();
t=g[U];
if(t>=x) K.push_back(2),mp[upd(v+hs[2])]+=t-x+1,K.pop_back();
K.push_back(1),K.push_back(1);
u64 V=upd(v+hs[1]*2);
for(int i=x;i<=cnt&&pr[i]<=U;i++) mp[V]+=g[TO(div(m,pr[i]))]-i;
K.pop_back(),K.pop_back();
return;
}
dfs(x+1,S,v);
for(LL i=1,s=S*pr[x];s<=n;i++,s*=pr[x])
{
K.push_back(i),mp[upd(v+hs[i])]++;
dfs(x+1,s,v+hs[i]);
K.pop_back();
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;
get::init();min_25_init();
for(int i=0;i<=100;i++) hs[i]=rnd();
dfs(1,1,0);LL ans=1;
for(auto [u,v]:mp) ans+=v*sol(mp1[u]);
cout<<ans;
return 0;
}