題目很簡潔:
求
其中
數據範圍:
解法:
設
則只需且必須:
所以
到了這一步,就用本人比較喜歡的方式進行莫比烏斯反演.
令
則由f,F的含義可得
反演得
又
所以
考慮到
至於
參考代碼
#include<cstdio>
#include<map>
using namespace std;
#define MAXN 3000010
#define mod 1000000007
#define LL long long
int lim=1000000;
int n,pri[MAXN],tot,mu[MAXN*10];
bool vis[MAXN*10];
void init()
{
mu[1]=1;
for(int i=2;i<=lim;i++)
{
if(!vis[i])
{
pri[++tot]=i;
mu[i]=-1;
}
for(int j=1;j<=tot&&i*pri[j]<=lim;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0)
{
mu[i*pri[j]]=0;
break;
}
else
{
mu[i*pri[j]]=-mu[i];
}
}
}
for(int i=1;i<=lim;i++)
{
mu[i]+=mu[i-1];
}
return ;
}
map<LL,LL>MU;
LL f(LL x)
{
if(x<=lim)
{
return mu[x];
}
if(MU.count(x))
{
return MU[x];
}
LL ans=0,e,ee;
for(e=2;e<=x;e=ee+1)
{
ee=(x/(x/e));
ans+=f(x/e)*(ee-e+1);
}
return MU[x]=1-ans;
}
int ans=0;
inline int cal(int x)
{
int ff,fff,an=0;
for(ff=1;ff<=x;ff=fff+1)
{
fff=x/(x/ff);
an+=1ll*(fff-ff+1)*(x/ff)%mod;
an-=an>=mod?mod:0;
}
return an;
}
int main()
{
scanf("%d",&n);
init();
int e,ee,q;
for(e=1;e<=n;e=ee+1)
{
ee=n/(n/e);
q=cal(n/e);
ans+=1ll*q*q%mod*(f(ee)-f(e-1))%mod;
ans+=ans<0?mod:0;
ans-=ans>=mod?mod:0;
}
printf("%d\n",ans);
return 0;
}