BZOJ 2440 完全平方数

Posted on 2016-04-25 22:51  ziliuziliu  阅读(131)  评论(0编辑  收藏  举报

考虑二分答案。而且1..n中他喜欢的大概占3/5左右。

考虑莫比乌斯函数与容斥原理,得答案。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define maxn 100050
using namespace std;
long long t,n,miu[maxn],prime[maxn],cnt=0;
bool vis[maxn];
void get_table()
{
    miu[1]=1;
    for (long long i=2;i<=maxn;i++)
    {
        if (vis[i]==false) 
        {
            vis[i]=true;
            prime[++cnt]=i;
            miu[i]=-1;
        }
        for (long long j=1;j<=cnt && i*prime[j]<=maxn;j++)
        {
            vis[i*prime[j]]=true;
            if (i%prime[j]==0) 
            {
                miu[i*prime[j]]=0;
                break;
            }
            else miu[i*prime[j]]=-miu[i];
        }
    }
}
long long cal(long long x)
{
    long long r=sqrt(x),ret=0;
    for (long long i=1;i<=r;i++)
        ret+=x/(i*i)*miu[i];
    return ret;
}
void work()
{
    scanf("%lld",&n);
    long long l=1,r=2000000000,ans;
    while (l<=r)
    {
        long long mid=(l+r)>>1;
        long long now=cal(mid);
        if (now>=n) {ans=mid;r=mid-1;}
        else l=mid+1;
    }
    printf("%lld\n",ans);
}
int main()
{
    scanf("%lld",&t);
    get_table();
    for (long long i=1;i<=t;i++)
        work();
    return 0;
}