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