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.

Ý 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

Không có ý kiến tại thời điểm này.