洛谷P4318 完全平方数(莫比乌斯函数)

https://www.luogu.com.cn/problem/P4318

 

二分,判定1-mid内有多少完全平方数的倍数

容斥原理,容斥系数就是莫比乌斯函数

 

#include<cstdio>

using namespace std;

#define N 100000

int pr[N],miu[N],tot;
bool vis[N];

void pre()
{
    for(int i=2;i<N;++i)
    {
        if(!vis[i])
        {
            pr[++tot]=i;
            miu[i]=-1;
        }
        for(int j=1;j<=tot && pr[j]*i<N;++j)
        {
            vis[pr[j]*i]=true;
            if(!(i%pr[j])) break;
            miu[pr[j]*i]=-miu[i];
        }
    }
}

int check(int n)
{
    int sum=0;
    for(int i=2;i*i<=n;++i)
        sum-=miu[i]*(n/(i*i));
    return n-sum;
}

int main()
{
    pre();
    int T,k,l,r,mid,ans;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&k);
        l=1;
        r=k*2;
        while(l<=r)
        {
            mid=1ll*l+r>>1;
            if(check(mid)<k) l=mid+1;
            else 
            {
                ans=mid;
                r=mid-1;
            }
        }
        printf("%d\n",ans);
    }
}

 

posted @ 2020-09-29 16:35  TRTTG  阅读(210)  评论(0编辑  收藏  举报