题解:AT_abc400_e [ABC400E] Ringo's Favorite Numbers 3
幸运数字一定能被表示成
注意到这东西等于
首先把质数筛出来。枚举质数
将存起来的
枚举
将存起来的
一个小问题是
然后查询时在
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int p[N], cnt;
bool st[N];
vector<int> vec;
vector<int> res;
set<int> S;
void init() {
for (int i = 2; i < N; ++ i ) {
if (!st[i]) p[ ++ cnt] = i;
for (int j = 1; p[j] <= (N - 1) / i; ++ j ) {
st[p[j] * i] = true;
if (i % p[j] == 0) break;
}
}
for (int i = 1; i <= cnt; ++ i ) {
for (int x = p[i]; x < N; x *= p[i]) {
vec.push_back(x);
S.insert(x);
}
}
sort(vec.begin(), vec.end());
for (int i = 0; i < vec.size(); ++ i )
for (int j = i + 1; j < vec.size(); ++ j ) {
int x = vec[i] * vec[j];
if (x < N) {
if (!S.count(x)) res.push_back(x);
} else break;
}
sort(res.begin(), res.end());
}
int solve() {
int x;
cin >> x;
x = sqrtl(x);
int ans = *(upper_bound(res.begin(), res.end(), x) - 1);
return ans * ans;
}
signed main() {
init();
int T;
cin >> T;
while (T -- ) cout << solve() << '\n';
return 0;
}