题解:
最后推出来是这个式子:(过程很常规,我就懒得写了)
∑T=1n⌊nT⌋2∑d|Tϕ(d)μ(Td)
∑
T
=
1
n
⌊
n
T
⌋
2
∑
d
|
T
ϕ
(
d
)
μ
(
T
d
)
后面的东西为两个积性函数的狄利克雷卷积,是可以线性筛的,筛的方法就是对于每个数,假如它的质因数分解为
p1k1p2k2……pnkn
p
1
k
1
p
2
k
2
…
…
p
n
k
n
(
p
p
是递增的),记录它的,对于
f[pk]
f
[
p
k
]
、
f[p]
f
[
p
]
、
f[1]
f
[
1
]
这些特殊的特判,然后其他的通过这个来分成两个互质的数求。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pa pair<int,int>
const int Maxn=10000010;
const int inf=10000000;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
int phi[Maxn],prime[Maxn],len=0,f[Maxn],g[Maxn];LL sum[Maxn];
bool mark[Maxn];
void pre()
{
phi[1]=f[1]=1;
for(int i=2;i<=inf;i++)
{
if(!mark[i])phi[i]=i-1,prime[++len]=i,f[i]=i-2,g[i]=i;
for(int j=1;j<=len&&prime[j]*i<=inf;j++)
{
mark[prime[j]*i]=true;
if(i%prime[j]==0)
{
phi[prime[j]*i]=phi[i]*prime[j];
g[prime[j]*i]=g[i]*prime[j];
if(i==g[i])f[prime[j]*i]=phi[prime[j]*i]-phi[i];
else f[prime[j]*i]=f[i/g[i]]*f[g[prime[j]*i]];
break;
}
phi[prime[j]*i]=phi[i]*(prime[j]-1);
f[prime[j]*i]=f[prime[j]]*f[i];
g[prime[j]*i]=prime[j];
}
}
sum[0]=0;
for(int i=1;i<=inf;i++)sum[i]=(LL)sum[i-1]+f[i];
}
int main()
{
pre();
int T=read();
while(T--)
{
int n=read(),pos;LL ans=0;
for(int i=1;i<=n;i=pos+1)
{
pos=n/(n/i);
ans+=(LL)(n/i)*(n/i)*(sum[pos]-sum[i-1]);
}
printf("%lld\n",ans);
}
}