线性筛求莫比乌斯反演函数+分块+前缀和

来源:互联网 发布:mac开机黑屏 编辑:程序博客网 时间:2024/06/05 13:21

#define maxn 1000100bool 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;}



                                             
0 0
原创粉丝点击