Hướng giải của Thừa số nguyên tố nhỏ nhất
Nhớ rằng hướng dẫn giải này chỉ nên sử dụng khi bế tắc, và tuyệt đối không nên sao chép mã nguồn kèm theo. Hãy tôn trọng tác giả bài tập và người viết hướng dẫn giải.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Ý tưởng: Tiền xử lý mảng SPF (smallest prime factor) cho mọi số đến N bằng biến thể của sàng Eratosthenes. Với mỗi truy vấn x, liên tục chia x cho spf[x] và ghi nhận thừa số cho đến khi x = 1.
Độ phức tạp: O(N log log N) tiền xử lý, O(log x) mỗi truy vấn thời gian, O(N) bộ nhớ.
C++
cpp
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6 + 5;
int spf[MAX];
void sieve() {
for (int i = 1; i < MAX; i++) spf[i] = i;
for (int i = 2; i * i < MAX; i++)
if (spf[i] == i)
for (int j = i * i; j < MAX; j += i)
if (spf[j] == j) spf[j] = i;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
sieve();
int n, q;
cin >> n >> q;
while (q--) {
int x;
cin >> x;
vector<int> factors;
while (x > 1) {
int p = spf[x];
while (x % p == 0) {
factors.push_back(p);
x /= p;
}
}
for (size_t i = 0; i < factors.size(); i++) {
if (i) cout << ' ';
cout << factors[i];
}
cout << '\n';
}
return 0;
}Python
python
MAX = 10**6 + 5
spf = list(range(MAX))
for i in range(2, int(MAX**0.5) + 1):
if spf[i] == i:
for j in range(i * i, MAX, i):
if spf[j] == j:
spf[j] = i
n, q = map(int, input().split())
for x in map(int, input().split()):
factors = []
while x > 1:
p = spf[x]
while x % p == 0:
factors.append(p)
x //= p
print(' '.join(map(str, factors)))
Nhận xét