canuc80k0806·7/50

Ba Ước Dương

Nộp bài trên LQDOJ

Bài 08 · Arithmetic

Cho một dãy gồm số nguyên dương. Với mỗi số , hãy xác định có đúng ba ước dương phân biệt hay không.

Với từng phần tử, in YES nếu số đó có đúng ba ước; ngược lại in NO.

Input

  • Dòng đầu chứa số nguyên - số phần tử.
  • Dòng thứ hai chứa số nguyên .

Output

  • In dòng. Dòng thứ là YES nếu có đúng ba ước dương, ngược lại là NO.

Constraints

  • .
  • .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

6
4 5 9 16 25 49

Output

YES
NO
YES
NO
YES
YES

Giải thích: Các số lần lượt là bình phương của các số nguyên tố , nên mỗi số có ba ước. Số chỉ có hai ước, còn là bình phương của - một hợp số - nên đều nhận NO.

Lời giải tóm tắt
  • Phân tích: Một số có số lượng ước lẻ chỉ khi nó là số chính phương. Nếu x=p^2 với p nguyên tố, các ước của x đúng là 1,p,p^2. Ngược lại, nếu căn của x là hợp số thì còn xuất hiện thêm các ước khác. Vì vậy điều kiện cần và đủ là: x là bình phương của một số nguyên tố.
  • Thuật toán: Sàng nguyên tố tới 10^6. Với mỗi x, tìm căn nguyên r và hiệu chỉnh quanh giá trị sqrt; in YES khi r*r=x và r được sàng là nguyên tố.
  • Chứng minh đúng: Nếu thuật toán in YES, x=p^2 với p nguyên tố nên có đúng ba ước. Nếu x có đúng ba ước, số lượng ước lẻ buộc x là chính phương; căn không thể hợp số, nên là nguyên tố và thuật toán cũng in YES. Hai chiều đều đúng.
  • Độ phức tạp: Sàng mất O(10^6 log log 10^6); mỗi phần tử được kiểm tra trong O(1), bộ nhớ O(10^6).