Kiểm Tra Số Hoàn Hảo (Phiên bản Hard)

Xem dạng PDF

Gửi bài giải

Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Dạng bài

Một số nguyên dương N được gọi là số hoàn hảo nếu tổng các ước dương thực sự của nó (không kể chính nó) bằng chính nó.

Ví dụ: 6 = 1 + 2 + 3.

Với N nhỏ, ta có thể duyệt ước. Nhưng với N lớn, hãy dùng định lý Euclid-Euler.

Cho số nguyên dương N. Hãy kiểm tra xem N có phải là số hoàn hảo hay không.


Input:

  • Dòng đầu tiên chứa số nguyên T (số lượng test case, T <= 100).

  • T dòng tiếp theo, mỗi dòng chứa một số nguyên N.


Giới hạn:

  • 1 <= N <= 10^18 (Lưu ý: N rất lớn, không thể vòng lặp đếm ước).

Output:

  • Với mỗi test case, in ra "YES" nếu N là số hoàn hảo, ngược lại in "NO".

Ví dụ

Input:
3
6
28
100
Output:
YES
YES
NO

Gợi ý thuật toán:

Thay vì tính tổng ước, hãy kiểm tra xem N có khớp với dạng 2^(p-1) * (2^p - 1) hay không.

B1: Chia N cho 2 liên tục để tìm 2^(p-1). Từ đó suy ra p.

B2: Kiểm tra xem phần còn lại có bằng (2^p - 1) không.

B3: Kiểm tra xem (2^p - 1) có phải là số nguyên tố không


Bình luận

Hãy đọc nội quy trước khi bình luận.


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