题目:全然平方数为含有平方数因子的数,求第n个非全然平方数。 n <= 10^9.
容易想到先二分,再容斥原理(莫比乌斯)。
num = (mid / i) * mu[i].
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <ctime>
#define Rep(i, x, y) for (int i = x; i <= y; i ++)
#define RepE(i, x) for (int i = pos[x]; i; i = g[i].nex)
using namespace std;
typedef long long LL;
const int N = 100001;
const LL inf = 1LL << 33;
int n, T, pri[N], tot, u[N];
LL l, r, d[N];
bool c[N];
void Pre() {
u[1] = 1;
Rep(i, 2, N-1) {
d[i] = (LL)i * i;
if (!c[i]) pri[++ tot] = i, u[i] = -1;
Rep(j, 1, tot) {
int k = i * pri[j];
if (k >= N) break ;
c[k] = 1;
if (i % pri[j]) u[k] = -u[i];
else { u[k] = 0; break; }
}
}
}
int main()
{
Pre();
cin >> T;
while (T --) {
scanf ("%d", &n);
l = 1, r = inf;
while (l < r) {
LL mid = (l+r+1) / 2, num = 0;
for (LL i = 2; i*i <= mid; i ++) num += (mid/d[i]) * -u[i];
if (mid - num >= n) r = mid - 1;
else l = mid;
}
printf ("%lld\n", l+1);
}
return 0;
}