题目
f(x)是一个积性函数。
#include<cstdio>
#include<tr1/unordered_map>
using namespace std;
using namespace std::tr1;
typedef long long ll;
const int N=1e6+5,mod=1e9+7,Max=2147483647,inv2=500000004;
int is[N+5],prime[N+5];
int mud[N+5];
void init(){
mud[1]=1;int tot=0;
for(int i=2;i<=N;++i){
if(!is[i]) prime[++tot]=i,mud[i]=-i;
for(int j=1;j<=tot&&(ll)i*prime[j]<=N;++j){
int t=i*prime[j];is[t]=1;
if(i%prime[j]==0){mud[t]=0;break;}
mud[t]=(ll)mud[i]*(-prime[j])%mod;
}
}
for(int i=2;i<=N;++i) mud[i]+=mud[i-1],mud[i]%=mod;
}
unordered_map<int,int>ans_mud;
inline int cal(int l,int r){
return (ll)(l+r)*(r-l+1)%mod*inv2%mod;
}
inline int f_mud(int n){
if(n<=N) return mud[n];
if(ans_mud[n]) return ans_mud[n];
ll res=1ll;
for(int l=2,r;l<=n&&r<Max;l=r+1)
r=n/(n/l),res-=(ll)cal(l,r)*f_mud(n/l)%mod,res%=mod;
return ans_mud[n]=(res+mod)%mod;
}
inline int solve(int n){
ll ans=0;
for(int l=1,r;l<=n&&r<Max;l=r+1)
r=n/(n/l),ans+=(ll)(f_mud(r)-f_mud(l-1))%mod*(n/l)%mod,ans%=mod;//cout<<l<<" "<<r<<endl;
return ans*ans%mod;
}
int main(){
init();int n;scanf("%d",&n);
printf("%d\n",solve(n));
}