#define maxn 1000100
bool v[maxn];
int prime[maxn],mu[maxn],sum[maxn];
void Moblus()
{
memset(v,false,sizeof(v));
mu[1]=1;
sum[1]=1;
sum[0]=0;
int tot=0;
for(int i=2;i<=maxn;i++)
{
if(!v[i]){
prime[tot++]=i;
mu[i]=-1;
}
for(int j=0;j<tot;j++){
if(i*prime[j]>maxn) break;
v[i*prime[j]]=true;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}else{
mu[i*prime[j]]=-mu[i];
}
}
sum[i]=sum[i-1]+mu[i];
}
}int main()
{
int t,n;
Moblus();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
LL ans=3;
for(int i=1,last;i<=n;i=last+1){//注意i的跨度
last=n/(n/i);
ans+=(LL)(sum[last]-sum[i-1])*(n/i)*(n/i)*((n/i)+3);//用sum[last]-sum[i-1]去代替原来的mu[i]。
}
printf("%lld\n",ans);
}
return 0;
}
线性筛求莫比乌斯反演函数+分块+前缀和
最新推荐文章于 2022-07-28 22:57:38 发布