【BZOJ2440】完全平方数(中山市选2011)-二分答案+莫比乌斯函数应用
测试地址:完全平方数
题目大意:求第
做法:这一题需要用到二分答案+莫比乌斯函数。
一般我们看到求第
以下是本人代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
int T;
ll k,mu[50010];
bool prime[50010];
void calc_mu()
{
ll n=2*(ll)1e9,sq=(ll)sqrt(n)+1;
for(ll i=1;i*i<=n;i++) mu[i]=1;
for(ll i=2;i*i<=n;i++)
{
if (!prime[i])
{
for(ll j=1;i*j<=sq;j++)
{
prime[i*j]=1;
if (!(j%i))
{
mu[i*j]=0;
continue;
}
mu[i*j]*=-1;
}
}
}
}
ll solve(ll x)
{
ll s=x;
for(ll i=2;i*i<=x;i++)
s+=mu[i]*(x/(i*i));
return s;
}
int main()
{
scanf("%d",&T);
calc_mu();
while(T--)
{
scanf("%lld",&k);
ll l=1,r=2*(ll)1e9;
while(l!=r)
{
ll mid=(l+r)>>1,s;
s=solve(mid);
if (s>=k) r=mid;
else l=mid+1;
}
printf("%lld\n",l);
}
return 0;
}