题意:
设:
f(n)=∑d|nμ(d)∗d
求
∑in∑jnf(lcm(i,j))∗f(gcd(i,j))
题解:
假如直接推柿子不太可做,要化简。
显然
f
是个积性函数
ans=(∑inf(i))2
不管平方
=∑in∑d|iμ(d)∗d=∑dnμ(d)∗d∗⌊nd⌋
然后杜教筛即可。
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
const LL mod=1000000007;
using namespace std;
LL n,mu[1000010],Sum[200010];LL prime[100010],pr=0;
bool v[1000010];
void pre()
{
mu[1]=1;
memset(v,true,sizeof(v));
for(LL i=2;i<=1000000;i++)
{
if(v[i]) prime[++pr]=i,mu[i]=-1;
for(LL j=1;j<=pr&&i*prime[j]<=1000000;j++)
{
v[i*prime[j]]=false;
if(i%prime[j]==0) {mu[i*prime[j]]=0;break;}
mu[i*prime[j]]=-mu[i];
}
}
for(LL i=1;i<=1000000;i++) mu[i]=(mu[i-1]+mu[i]*i)%mod;
}
LL sum(LL x) {return x*(x+1)%mod*500000004LL%mod;}
LL solve(LL x)
{
if(x<=1000000) return mu[x];
if(Sum[n/x]!=0) return Sum[n/x];
LL j,ans=1;
for(LL i=2;i<=x;i=j+1)
{
j=x/(x/i);
ans-=(sum(j)-sum(i-1))%mod*solve(x/i);ans%=mod;
}
Sum[n/x]=ans;
return ans;
}
int main()
{
pre();
scanf("%lld",&n);
LL ans=0,j;
for(LL i=1;i<=n;i=j+1)
{
j=n/(n/i);
ans+=(solve(j)-solve(i-1))%mod*(n/i);ans%=mod;
}
printf("%lld",ans*ans%mod);
}