using ll = longlong; using uint = unsigned; constint T = 8e6, MaxT = T+5;
int p[MaxT/8], totP; ll mu[MaxT], phi[MaxT]; voidsieve(int n){ mu[1] = phi[1] = 1; for (int i=2; i<=n; i++){ if (!phi[i]) { p[++totP] = i; phi[i] = i-1; mu[i] = -1; } for (int j=1; j<=totP; j++){ int t = i*p[j]; if (t>n) break; if (i%p[j] == 0) { phi[t] = phi[i]*p[j]; break; } mu[t] = -mu[i]; phi[t] = phi[i]*(p[j]-1); } } for (int i=2; i<=n; i++){ mu[i] += mu[i-1]; phi[i] += phi[i-1]; } }
std::map<int, ll> mu2, phi2;
ll Smu(uint n){ if (n<=T) return mu[n]; if (mu2.find(n) != mu2.end()) return mu2[n]; ll ret = 1; uint l = 2; while(l<=n) { int r = n/(n/l); ret -= Smu(n/l)*(r-l+1); l = r+1; } return mu2[n] = ret; } ll Sphi(uint n){ if (n<=T) return phi[n]; if (phi2.find(n) != phi2.end()) return phi2[n]; ll ret = 1ll*n*(n+1)/2; uint l = 2; while(l<=n) { int r = n/(n/l); ret -= Sphi(n/l)*(r-l+1); l = r+1; } return phi2[n] = ret; }
using ll = longlong; constint MaxT = 4.65e6, mod = 1000000007, inv2 = (mod+1)/2, inv6 = (mod+1)/6;
int p[MaxT/8], totP, Hpk[MaxT/8][36], G[MaxT]; intlog(int p, ll n){ int c = 0; while(n) { n/=p; c++; } return c; } voiddiv(int *f, int *g, int *h, int n){ h[0] = 1; for (int i=1; i<n; i++) { int buf = 0; for (int k=1; k<=i; k++) buf = (buf + 1ll*g[k]*h[i-k]) %mod; h[i] = (f[i]-buf+mod) %mod; } } voidsieve(int T, ll N){ G[1]=1; for (int i=2; i<=T; i++) { if (!G[i]) { p[++totP] = i; G[i] = i-1; } for (int j=1; j<=totP; j++) { int t = i*p[j]; if (t>T) break; if (i%p[j]==0) { G[t] = G[i]*p[j]; break; } G[t] = G[i]*(p[j]-1); } } for (int i=1; i<=T; i++) G[i] = (G[i-1]+1ll*i*G[i]) %mod; for (int i=1; i<=totP; i++) { int m = log(p[i], N); staticint f[36], g[36]; f[0] = g[0] = 1; int pk = 1; for (int k=1; k<m; k++) { g[k] = 1ll*pk*pk%mod*p[i]%mod*(p[i]-1)%mod; pk = 1ll*pk*p[i] %mod; f[k] = 1ll*pk*(pk-1) %mod; } div(f, g, Hpk[i], m); } }
int T; std::map<ll, int> G2; intSG(ll n){ if (n<=T) return G[n]; if (G2.find(n) != G2.end()) return G2[n]; int ret = 0; ll l = 2; while(l<=n) { ll r = n/(n/l); int sumId = ((r-l+1)%mod)*((l+r)%mod) %mod; ret = (ret + 1ll*SG(n/l)*sumId) %mod; l = r+1; } int n0 = n%mod; ret = (1ll*n0*(n0+1)%mod*(n0*2+1)%mod*inv6-1ll*ret*inv2) %mod; ret = (ret+mod)%mod; return G2[n] = (ret+mod) %mod; }
int ans; voiddfs(ll N, ll d, int h, int t){ ans = (ans + 1ll*h*SG(N/d)) %mod; for (int i=t; i<=totP; i++) { if (d > N/(1ll*p[i]*p[i])) return ; int k = 2; ll newd = d*p[i]*p[i]; while (newd<=N) { dfs(N, newd, 1ll*h*Hpk[i][k]%mod, i+1); newd *= p[i]; k++; } } } intmain(){ ll N; scanf("%lld", &N); T = pow(N, 2./3.); sieve(T, N); dfs(N, 1, 1, 1); printf("%d\n", ans); return0; }