题目并不难,不过没想起来
题解:http://blog.csdn.net/qq_35649707/article/details/75930849
看完题解,还是wa了好几发,上界设小了。。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <climits>
const int MAXN = 1e5;
int mu[MAXN+10];
int prime[MAXN+10];
bool check[MAXN+10];
void Mobius()
{
memset(check,false,sizeof(check));
mu[1] = 1;
int tot = 0;
for(int i = 2; i <= MAXN; i++)
{
if(!check[i] )
{
prime[tot++] = i;
mu[i] = -1;
}
for(int j = 0; j < tot; j ++)
{
if( i * prime[j] > MAXN) break;
check[i * prime[j]] = true;
if( i % prime[j] == 0)
{
mu[i * prime[j]] = 0;
break;
}
else
{
mu[i * prime[j]] = -mu[i];
}
}
}
}
int C(long long mid)
{
int res = 0;
for(long long i = 1; i*i <= mid; ++i)
res += mu[i]*(mid/(i*i));
return res;
}
int main()
{
int T;
int k;
Mobius();
scanf("%d",&T);
while(T--)
{
scanf("%d",&k);
long long l = 1;
long long r = INT_MAX;
long long mid;
int res;
while(l <= r)
{
mid = (l+r) >> 1;
if(C(mid) >= k)
res = mid,r = mid-1;
else
l = mid+1;
}
printf("%d\n", res);
}
return 0;
}