好久好久之前,有一隻神犇叫yzy;
好久好久以後,有一隻蒟蒻叫lty;
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<map> 7 using namespace std; 8 typedef long long lol; 9 int N=8000000,Mod=1e9+7,inv6; 10 int prime[1000001],phi[8000000+5],n,tot; 11 bool vis[8000000+5]; 12 map<int,int> M; 13 int qpow(int x,int y) 14 { 15 int res=1; 16 while (y) 17 { 18 if (y&1) res=1ll*res*x%Mod; 19 x=1ll*x*x%Mod; 20 y>>=1; 21 } 22 return res; 23 } 24 int query(int x) 25 {int i,pos; 26 if (x<=N) return phi[x]; 27 if (M[x]) return M[x]; 28 int as=1ll*(x+1)*x%Mod*(2*x+1)%Mod*inv6%Mod; 29 for (i=2;i<=x;i=pos+1) 30 { 31 pos=x/(x/i); 32 as-=(1ll*(pos+i)*(pos-i+1)/2)%Mod*query(x/i)%Mod; 33 as=(as+Mod)%Mod; 34 } 35 return M[x]=as; 36 } 37 void pre() 38 {int i,j; 39 phi[1]=1; 40 for (i=2;i<=N;i++) 41 { 42 if (vis[i]==0) 43 { 44 prime[++tot]=i; 45 phi[i]=i-1; 46 } 47 for (j=1;j<=tot;j++) 48 { 49 if (1ll*i*prime[j]>N) break; 50 vis[i*prime[j]]=1; 51 if (i%prime[j]==0) 52 { 53 phi[i*prime[j]]=1ll*phi[i]*prime[j]%Mod; 54 break; 55 } 56 else phi[i*prime[j]]=1ll*phi[i]*(prime[j]-1)%Mod; 57 } 58 } 59 for (i=1;i<=N;i++) 60 { 61 phi[i]=(1ll*i*phi[i]%Mod+phi[i-1])%Mod; 62 } 63 } 64 int main() 65 { 66 cin>>n; 67 cout<<1<<endl; 68 N=min(N,n); 69 pre(); 70 inv6=qpow(6,Mod-2); 71 printf("%d\n",query(n)); 72 }