canuc80k1100·1/50

Lũy Thừa Rút Gọn

Nộp bài trên LQDOJ

Bài 11 · Divide and Conquer

Cho ba số nguyên dương và . Giá trị có thể lớn đến mức không thể lưu trực tiếp, nhưng ta chỉ cần phần dư của nó khi chia cho .

Hãy tính .

Input

  • Một dòng chứa ba số nguyên .

Output

  • In ra một số nguyên duy nhất là .

Constraints

  • .

Scoring

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

Example

Test 1

Input

7 13 10

Output

7

Giải thích: Ta có tận cùng bằng , vì vậy phần dư khi chia cho là .

Lời giải tóm tắt
  • Ý tưởng: Chia đôi số mũ; tính một lần lũy thừa với B/2, bình phương kết quả và nhân thêm A khi B lẻ.
  • Thuật toán: 1. Giảm A theo mô-đun C. 2. Tính đệ quy một lần cho B/2. 3. Bình phương bằng kiểu trung gian __int128; nếu B lẻ, nhân thêm A. 4. Trả kết quả đã lấy mô-đun.
  • Chứng minh tính đúng đắn: Xét số mũ b. Với b=0, kết quả là 1 mod C. Giả sử lời gọi cho floor(b/2) đúng. Nếu b chẵn, bình phương kết quả đó cho A^b; nếu b lẻ, nhân thêm A. Lấy mô-đun không làm đổi phần dư, nên quy nạp hoàn tất.
  • Độ phức tạp: Thời gian O(log B), bộ nhớ ngăn xếp O(log B).