vijos1889 天真的因数分解

http://www.elijahqi.win/archives/1201
这个分块和之前的差不多 x/(x/i*i) 就是相同值的最后一个i在哪里然后开方即可

我们所要做的就是求出第k个质因数不唯一的数

不可识别等价于求有多少个因数为素数平方的数 那么像2 3 这种会重复算6的我们可以用莫比乌斯函数来搞这个 (容斥原理)

#include<cstdio>
#include<cmath>
#define ll long long
#define N 1100000
ll k;int mu[N],prime[N],not_prime[N];
inline bool check(ll mid){
    long long last=0,ans=0;
    for (int i=2;i<=sqrt(mid);i=last+1){
        ll d=(ll)i*i;last=sqrt(mid/(mid/d));
        ans+=mid/d*(mu[last]-mu[i-1]);
    }
    /*for (int i=2;i<=sqrt(mid);++i){
        ll d=(ll)i*i;ans+=mid/d*mu[i];
    }*/
    ans*=-1;

    return ans>=k;
}
int main(){
    freopen("1889.in","r",stdin);
    scanf("%lld",&k);mu[1]=1;int top=0;
    for (int i=2;i<=1000000;++i){
        if (!not_prime[i]){
            mu[i]=-1;prime[++top]=i;
        }
        for (int j=1;i*prime[j]<=1000000;++j){
            not_prime[i*prime[j]]=true;
            if (i%prime[j]==0){
                mu[i*prime[j]]=0;break;
            }mu[i*prime[j]]=-mu[i];
        }
    }
    //for (int i=1;i<=30;++i) printf("%d ",mu[i]);
    for (int i=2;i<=1000000;++i) mu[i]+=mu[i-1];
    ll l=1,r=1e11;
    while (l<=r){
        ll mid=l+r>>1;
        if (check(mid)) r=mid-1;else l=mid+1;
    }
    printf("%lld",l);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/elijahqi/article/details/80233531