感觉反而是全场的简单题。
题面
当且仅当正整数 NNN 同时满足以下两个条件时,它是 400 数:
- NNN 恰好有 222 个不同的质因数。
- 对于 NNN 的每个质因数 ppp , ppp 除以 NNN 的次数是偶数。更正式地说, pkp^kpk 整除 NNN 的最大非负整数 kkk 是偶数。
处理 QQQ 次查询。每次查询都会得到一个整数 AAA ,请找出不超过 AAA 的最大 400 个数字。在此问题的限制条件下,不超过 AAA 的 400 个数字总是存在的。
看到质因数,果断质因数分解。
根据数论,可知如果要满足第二点,NNN 一定是完全平方数。
观察到 N≤1012N \le 10^{12}N≤1012,则 N≤106\sqrt N \le 10^6N≤106,是一个相对小的范围。考虑将题目往 N\sqrt NN 上面引。
而如果要满足第一点,NNN 就有两个质因子,而显然 N\sqrt NN 也是只有两个质因子。
因此就考虑使用调和级数,每一个数的质因子数量很容易通过埃氏筛法求出。复杂度 O(nlogn)O(n \log n)O(nlogn)。
考虑如何得到答案,直接把所有只有两个质因子的数存下来,直接二分即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200010, M = 1000010;
bool f[M];
int cnt[M];
int q;
vector<int> v;
signed main() {
f[1] = 1;
cnt[1] = 0;
for (int i = 2; i <= 1e6; i++) {
if (!f[i]) {
cnt[i] = 1;
for (int j = 2 * i; j <= 1e6; j += i)
f[j] = 1, cnt[j]++;
}
}
for (int i = 1; i <= 1e6; i++)
if (cnt[i] == 2)
v.push_back(i);
cin >> q;
while (q--) {
int x;
cin >> x;
int y = sqrt(x);
int pos = *(--upper_bound(v.begin(), v.end(), y));
cout << pos*pos << endl;
}
return 0;
}
960

被折叠的 条评论
为什么被折叠?



