官方题解|美丽数 II
2025-02-04 22:09:13
发布于:北京
48阅读
0回复
0点赞
题目解析
本题若我们直接使用质因数分解,对于 执行普通的质因数分解,时间复杂度为 ,对于 个查询,总的时间复杂度为 ;然而这个计算量达到了 级别,无法在时限内通过题目。
根据 素数定理:
其中 表示:不超过 的整数中素数的数量。
实际上 以内的素数只有 个。
所以我们可以把 内所有的 个素数预处理,来加速质因数分解,使其复杂度降为 。这样整个算法时间复杂度为 ;其计算量大约为 ,可以在时限内通过题目。
AC代码
#include <bits/stdc++.h>
using i64 = long long;
constexpr int N = 1e5;
std::bitset<N + 1> st;
std::vector<int> primes;
auto sieve = []() {
for (i64 i = 2; i <= N; ++i) {
if (st[i]) continue;
for (i64 j = i * i; j <= N; j += i)
st[j] = 1;
primes.push_back(i);
}
return 0;
} ();
int solve() {
i64 n; std::cin >> n;
int cnt = 0;
for (auto &p: primes) {
while (n % p == 0) {
n /= p;
cnt += 1;
}
if (cnt > 3) break;
}
if (n > 1) cnt += 1;
std::cout << (cnt == 3 ? "Yes" : "No") << '\n';
return 0;
}
int main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int _; std::cin >> _;
while (_--) solve();
return 0;
}
这里空空如也
有帮助,赞一个