Hướng dẫn cho Python Basic Contest #01 - Đếm số nguyên tố trên đoạn (Python only)


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: Sunlight

Lời giải
Subtask 1 + 2: l = 1, r \le 4 \times 10^4
  • Bạn chỉ cần duyệt qua tất cả các số từ l đến r và kiểm tra tính nguyên tố của chúng. Tùy vào cách cài đặt hàm kiểm tra nguyên tố của bạn mà thuật toán có thể có độ phức tạp O(r^2) hoặc O(r \times \sqrt{r}).
Subtask 3: l = 1
  • Với subtask này, ta chỉ cần cài đặt sàng nguyên tố là giải được bài toán, vì r - l \le 10^6.

Độ phức tạp: O(r \times log_2(log_2(n))).

Subtask 4: r - l \le 2000
  • Xét ý tưởng của việc kiểm tra tính nguyên tó của một só Ta có nhận xét sau: Nếu một số nguyên dương n là hợp số, tồn tại một số nguyên tố p \le \sqrt{n}n chia hết cho p.
  • Với ý tưởng này, ta sử dụng sàng nguyên tố đề tìm tất cả các số nguyên tố không vượt quá \sqrt{r}, và với hàm kiểm tra nguyên tố ta chỉ cần kiểm tra tính chia hết của một số cho các số nguyên tố này mà thôi. Điều này có thể giảm đáng kể độ phức tạp.

Độ phức tạp: (xấp xỉ) O((r - l) \times \frac{\sqrt{r}}{log_2(r)} + \sqrt{r} \times log_2(log_2(n))), nhưng với hằng số C khá nhỏ.

Subtask 5: r - l \le 10^5
  • Từ nhận xét cơ bản: nếu n là một hợp số thì n tồn tại một ước nguyên dương khác 1 không vượt quá \sqrt{n}, ta có ý tưởng tương tự như sàng nguyên tố như sau: Với mọi i từ 2 đến \sqrt{r}, ta loại bỏ tất cả các bội của i khỏi danh sách. Những số còn lại sẽ là các số nguyên tố.
  • Để thực hiện hoá ý tưởng trên, ban đầu ta khởi tạo một mảng checkr - l phần tử với tất cả các phần tử đều là True. Nếu phần tử thứ i được đánh dấu là hợp số, ta đặt check[i - l] thành False. Như vậy, nếu check[i] = True sau khi đánh dấu, ta kết luận l + i là số nguyên tố.

Độ phức tạp: O((r - l) \times log_2(r - l)).

Subtask 6: Không có giới hạn gì thêm
  • Ta sẽ tối ưu subtask 5 bằng nhận xét từ subtask 4, nghĩa là thay vì duyệt toàn bộ các số, ta chỉ cần duyệt các số nguyên tố trong đoạn từ 2 đến \sqrt{r}, tất nhiên các số nguyên tố này phải được tính trước bằng sàng nguyên tố.

Độ phức tạp: O((r - l) \times log_2(log_2(r - l)) + \sqrt{r} \times log_2(log_2(r))).



Bình luận

Không có bình luận nào.