【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 100005 int tot, prime[MAXN], f[MAXN], miu[MAXN]; void init() { for (int i = 2; i < MAXN; i++) { if (f[i] == 0) { prime[++tot] = i; f[i] = i; miu[i] = -1; } for (int j = 1; j <= tot && prime[j] <= f[i]; j++) { int tmp = i * prime[j]; if (tmp >= MAXN) break; f[tmp] = prime[j]; if (prime[j] == f[i]) miu[tmp] = 0; else miu[tmp] = -miu[i]; } } } long long check(long long value) { long long ans = value; for (long long i = 2; i * i <= value; i++) ans += miu[i] * (value / i / i); return ans; } int main() { init(); int T; scanf("%d", &T); while (T--) { long long n; scanf("%lld", &n); long long l = 1, r = 1ll << 32ll; while (l < r) { long long mid = (l + r) / 2; if (check(mid) >= n) r = mid; else l = mid + 1; } printf("%lld\n", l); } return 0; }