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

T-nguyên tố

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

Quan sát then chốt: một số nguyên dương t có đúng ba ước số phân biệt khi và chỉ khi t=p2 với p là số nguyên tố. Khi đó tập ước của t là {1,p,p2}.

Chứng minh: nếu t=p1a1p2a2⋯pkak thì số ước của t là ∏(ai+1). Để tích này bằng 3 (số nguyên tố), ta phải có duy nhất một thừa số ai+1=3, tức là t=p2 với p nguyên tố.

Nhận xét quan trọng

  1. xi≤1012 nên xi≤106.
  2. Sàng Eratosthenes các số nguyên tố tới 106 chỉ tốn O(NloglogN) thời gian và bộ nhớ O(N).
  3. Với mỗi x, kiểm tra: lấy s=⌊x⌋, nếu s2=x và s là số nguyên tố (s≥2) thì in YES, ngược lại NO.
  4. Khi tính x trong C++ với sqrtl, nên hiệu chỉnh kết quả bằng cách kiểm tra s2, (s+1)2 vì lỗi số thực có thể làm sai lệch ±1. Trong Python dùng math.isqrt cho kết quả chính xác.

Thuật toán

  1. Sàng Eratosthenes mảng is_prime[0..10^6].
  2. Đọc n, sau đó với mỗi xi:
    • Tính s=⌊xi⌋ (có hiệu chỉnh).
    • Nếu s≥2, s2=xi và s là số nguyên tố thì in YES, ngược lại in NO.

Độ phức tạp

  • Thời gian: O(MloglogM+n) với 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