#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 发布
本文介绍了一种高效的莫比乌斯函数预处理算法,该算法利用筛法计算莫比乌斯函数值并累加求和,适用于解决涉及数论变换的问题。通过预先计算,可以在后续查询中快速获得结果。
488

被折叠的 条评论
为什么被折叠?



