bzoj2440 [中山市选2011]完全平方数——莫比乌斯+容斥

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2440

莫比乌斯...被难倒...

看TJ:http://hzwer.com/4827.html

再看TJ:https://blog.csdn.net/xiefubao/article/details/30567715

努力抄写理解...

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int const maxn=50005;
ll const inf=1e18;
int T,cnt,mu[maxn],pri[maxn],n;
ll l,r,ans;
bool vis[maxn];
void init()
{
    mu[1]=1;//
    for(int i=2;i<=maxn;i++)
    {
        if(!vis[i])pri[++cnt]=i,mu[i]=-1;
        for(int j=1;j<=cnt&&pri[j]*i<=maxn;j++)
        {
            vis[i*pri[j]]=1;
            if(i%pri[j]==0)
            {
                mu[i*pri[j]]=0; break;//原本就有平方因子者贡献为0 
            }
            mu[i*pri[j]]=-mu[i];//根据质因子种类数 
        }
    }
}
ll calc(int x)
{
    ll sum=0;
    for(int i=1;i*i<=x;i++)//1
//        sum+=mu[i]/(i*i)*x;//mu 仅为 1 或 -1 
        sum+=x/(i*i)*mu[i];//i*i -> 产生平方因子 
    return sum;
}
int main()
{
    scanf("%d",&T);
    init();
    while(T--)
    {
        scanf("%d",&n);
        l=n; r=1644934081;//
        while(l<=r)
        {
            ll mid=(l+r)/2;
            if(calc(mid)>=n)ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

posted @ 2018-06-30 21:50  Zinn  阅读(147)  评论(0编辑  收藏  举报