Đếm số nguyên tố trong đoạn
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
Bài toán có nhiều truy vấn đếm số nguyên tố trong các đoạn. Giá trị tối đa nên ta có thể tiền xử lý một lần: dùng sàng Eratosthenes để xác định những số nào là nguyên tố, rồi xây dựng mảng tiền tố đếm số nguyên tố. Mỗi truy vấn sau đó được trả lời trong .
Nhận xét quan trọng
- không phải là số nguyên tố — cần khởi tạo
is_prime[0] = is_prime[1] = 0. - Đếm số nguyên tố trong đoạn chính là , trong đó là số nguyên tố trong . Lưu ý chỉ số , không phải .
- Vì , biểu thức luôn hợp lệ nếu mảng có chỉ số .
Thuật toán
- Đặt . Khởi tạo mảng
is_primekích thước với giá trị , đặtis_prime[0] = is_prime[1] = 0. - Sàng Eratosthenes: với mỗi từ đến , nếu
is_prime[i] = 1thì đánh dấuis_prime[j] = 0với mọi . - Xây dựng mảng tiền tố
cnt[0..M]:cnt[0] = 0,cnt[i] = cnt[i-1] + is_prime[i]. - Với mỗi truy vấn , in ra
cnt[R] - cnt[L-1].
Trong Python, dùng bytearray cho mảng is_prime và sys.stdin.buffer để đọc nhanh.
Độ phức tạp
- Thời gian: trong đó .
- Bộ nhớ: .
Bình luận