题目大意:
小 X讨厌所有是完全平方数的正整数倍的数。
问第
K
K
K个小X不讨厌的数是多少。
询问有
Q
Q
Q个
1
≤
K
≤
1
0
9
1 ≤ K ≤ 10^9
1≤K≤109
Q
≤
50
Q ≤ 50
Q≤50
分析:
容斥一下可以发现
A
n
s
w
e
r
=
Σ
μ
[
i
]
∗
(
n
/
i
2
)
Answer=Σμ[i]*(n/i^2)
Answer=Σμ[i]∗(n/i2)
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <cstring>
#include <algorithm>
#define N 50005
using namespace std;
typedef long long ll;
int prime[N], check[N], mu[N], T, n, cnt;
void Pre_Work()
{
mu[1] = 1;
for (int i = 2; i <= 50000; i++)
{
if (!check[i])
prime[++cnt] = i, mu[i] = -1;
for (int j = 1; j <= cnt; j++)
{
if (i * prime[j] > 50000) break;
check[i * prime[j]] = 1;
if (i % prime[j] == 0) { mu[i * prime[j]] = 0; break; }
mu[i * prime[j]] = -mu[i];
}
}
}
ll Get_yzh(ll x)
{
ll Number = 0;
for (ll i = 1; i * i <= x; i++) Number = Number + mu[i] * (x / (i * i));
return Number;
}
void Get_Answer(int x)
{
ll l = 0, r = 0x7fffffff, Answer = 0;
while (l <= r)
{
ll mid = (l + r) >> 1;
if (Get_yzh(mid) >= x) Answer = mid, r = mid - 1;
else l = mid + 1;
}
printf("%lld\n", Answer);
}
int main()
{
Pre_Work();
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
Get_Answer(n);
}
return 0;
}