Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng tiếp cận
Quan sát then chốt: một số nguyên dương có đúng ba ước số phân biệt khi và chỉ khi với là số nguyên tố. Khi đó tập ước của là .
Chứng minh: nếu thì số ước của là . Để tích này bằng (số nguyên tố), ta phải có duy nhất một thừa số , tức là với nguyên tố.
Nhận xét quan trọng
- nên .
- Sàng Eratosthenes các số nguyên tố tới chỉ tốn thời gian và bộ nhớ .
- Với mỗi , kiểm tra: lấy , nếu và là số nguyên tố () thì in
YES, ngược lạiNO. - Khi tính trong C++ với
sqrtl, nên hiệu chỉnh kết quả bằng cách kiểm tra , vì lỗi số thực có thể làm sai lệch ±1. Trong Python dùngmath.isqrtcho kết quả chính xác.
Thuật toán
- Sàng Eratosthenes mảng
is_prime[0..10^6]. - Đọc , sau đó với mỗi :
- Tính (có hiệu chỉnh).
- Nếu , và là số nguyên tố thì in
YES, ngược lại inNO.
Độ phức tạp
- Thời gian: với .
- Bộ nhớ: .
Bình luận