trang chủ / đề bài / pfcntprime / lời giải

Đế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.
Tác giả: huunguyenhuunguyen

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 R≤106 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 O(1).

Nhận xét quan trọng

  1. 1 không phải là số nguyên tố — cần khởi tạo is_prime[0] = is_prime[1] = 0.
  2. Đếm số nguyên tố trong đoạn [L,R] chính là cnt[R]−cnt[L−1], trong đó cnt[i] là số nguyên tố trong [1,i]. Lưu ý chỉ số L−1, không phải L.
  3. Vì L≥1, biểu thức L−1≥0 luôn hợp lệ nếu mảng cnt có chỉ số 0.

Thuật toán

  1. Đặt M=106. Khởi tạo mảng is_prime kích thước M+1 với giá trị 1, đặt is_prime[0] = is_prime[1] = 0.
  2. Sàng Eratosthenes: với mỗi i từ 2 đến M, nếu is_prime[i] = 1 thì đánh dấu is_prime[j] = 0 với mọi j=i2,i2+i,…,M.
  3. Xây dựng mảng tiền tố cnt[0..M]: cnt[0] = 0, cnt[i] = cnt[i-1] + is_prime[i].
  4. Với mỗi truy vấn (L,R), 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: O(MloglogM+q) trong đó M=106.
  • Bộ nhớ: O(M).

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0