【BZOJ4196】软件包管理器
【BZOJ3669】魔法森林

【BZOJ2440】完全平方数

Zarxdy34 posted @ 2015年11月29日 13:25 in BZOJ with tags 莫比乌斯反演 , 384 阅读

    容斥原理,利用Mobius函数。

 

 

#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=50010;
 
int NotPrime[maxn],Prime[maxn],Primes,Mu[maxn];
int n;
 
void Get_Mu()
{
    Mu[1]=1;
    for (int i=2;i<maxn;i++)
    {
        if (!NotPrime[i])
        {
            Prime[++Primes]=i;
            Mu[i]=-1;
        }
        for (int j=1;j<=Primes && i*Prime[j]<maxn;j++)
        {
            NotPrime[i*Prime[j]]=1;
            if (i%Prime[j]==0)
            {
                Mu[i*Prime[j]]=0;
                break;
            }
            Mu[i*Prime[j]]=-Mu[i];
        }
    }
}
 
bool Check(int x)
{
    int res=0;
    for (int i=1;i*i<=x;i++)
        res+=x/(i*i)*Mu[i];
    return res>=n;
}
 
int main()
{
    Get_Mu();
    int T;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&n);
        int l=1,r=n*2,mid;
        while (l<r)
            if (Check(mid=l+((r-l)>>1))) r=mid;else l=mid+1;
        printf("%d\n",l);
    }
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter