社区讨论

求助各位大佬

P4213【模板】杜教筛参与者 5已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo90mliz
此快照首次捕获于
2023/10/28 03:37
2 年前
此快照最后确认于
2023/10/28 03:37
2 年前
查看原帖
各位谷民,请问P4213的这个提交记录是什么鬼???玄学CE???
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int t,n,vis[5000001],cnt,prime[5000001],mu[5000001]{0,1},w[5000001];
long long phi[5000001]{0,1},ans;
bitset<5000001>v;
int _(int x){
    return n/x;
}
int cal(int n){
    if(n<=5000000)return mu[n];
    if(v[_(n)])return w[_(n)];
    int ret=1;
    for(int l=2,r;l<=n;l=r+1){
        r=n/(n/l);
        ret-=(r-l+1)*cal(n/l);
    }
    v[_(n)]=1;
    return w[_(n)]=ret;
}
int main(){
    for(int i=2;i<=5000000;i++){
        if(!vis[i])prime[++cnt]=i,mu[i]=-1,phi[i]=i-1;
        for(int j=1;j<=cnt&&i*prime[j]<=5000000;j++){
            vis[i*prime[j]]=1;
            if(!(i%prime[j])){
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*(prime[j]-1);
            mu[i*prime[j]]=-mu[i];
        }
        mu[i]+=mu[i-1];
        phi[i]+=phi[i-1];
    }
    cin>>t;
    while(t--){
        ans=0;
        v.reset();
        scanf("%d",&n);
        if(n<=5000000)printf("%lld %d\n",phi[n],mu[n]);
        else{
            for(int l=1,r;l<=n;l=r+1){
                r=n/(n/l);
                ans+=(n/l)*(n/l+1)/2*(cal(r)-cal(l-1));
            }
            printf("%lld %d\n",ans,cal(n));
        }
    }
}
悬赏关注,bbl

回复

4 条回复,欢迎继续交流。

正在加载回复...