MLE 求助
查看原帖
MLE 求助
590600
Kreado楼主2023/5/15 21:43
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=1.6e7+7;
ll n,ans,lim;
ll mu[Maxn],t[Maxn];
vector<ll>prime;
bitset<Maxn>isprime;
map<ll,ll>Mu;
inline void init(ll N){
    isprime[1]=mu[1]=1;
    for(ll i=2;i<=N;i++){
        if(!isprime[i]) prime.push_back(i),mu[i]=-1;
        for(auto j:prime){
            if(j*i>N) break;
            isprime[i*j]=1;
            if(i%j) mu[i*j]=-mu[i];
            else break;
        }
    }
    for(ll i=1;i<=N;i++) t[i]=t[i-1]+mu[i]*(n/i/i),mu[i]+=mu[i-1];
}
inline ll Getmu(ll x){
    if(x<=1.6e7) return mu[x];
    if(Mu.count(x)) return Mu[x];
    ll res=1;
    for(ll l=2,r;l<=x;l=r+1){
        r=n/(n/l);
        res-=(r-l+1)*Getmu(n/l);
    }
    return Mu[x]=res;
}
int main(){
    scanf("%lld",&n);
    init(1.6e7);
    ll sq=sqrtl(n);
    for(ll l=1,r;l<=sq;l=r+1){
        ll w=n/l/l;
        r=sqrt(n/w);
        ans+=w*(Getmu(r)-Getmu(l-1));
    }
    printf("%lld",ans);
    return 0;
} 
2023/5/15 21:43
加载中...