[10074] Lũy thừa nhị phân nhanh trong mã hóa mật mã
Xem dạng PDF🤔 Mô tả bài toán:
Trong hệ thống mã hóa bảo mật thông tin, ta cần tính giá trị ~A^B~ chia lấy dư cho M (~A^B~ % M) với số mũ B cực kỳ lớn (lên tới ~10^{18}~). Phép nhân lặp tuần tự thông thường ~O(B)~ bước sẽ bị TLE. Ta cần sử dụng đệ quy chia để trị (Lũy thừa nhị phân):
- Nếu B = 0: ~A^0~ = 1.
- Nếu B chẵn: ~A^B~ = (~A^{B/2}~)^2.
- Nếu B lẻ: ~A^B~ = A * (~A^{B/2}~)^2.
Yêu cầu: Viết hàm đệ quy tính ~A^B~ % M.
💾 Dữ liệu vào:
Cho từ tệp văn bản POWMOD.INP có dạng:
● Một dòng chứa 3 số nguyên dương A, B, M (1 ≤ A, M ≤ 109, 1 ≤ B ≤ 1018).
💻 Dữ liệu ra:
Ghi ra tệp văn bản POWMOD.OUT gồm một số nguyên duy nhất là kết quả phép tính.
🔍 Ví dụ:
| POWMOD.INP | POWMOD.OUT |
|---|---|
| 2 10 1000 | 24 |
📌 Ràng buộc dữ liệu:
+ Có 100% số test tương ứng với 100% số điểm của bài thỏa mãn các điều kiện ở phần dữ liệu vào.
⚠️ Lưu ý về File I/O:
Bài tập yêu cầu đọc dữ liệu từ tệp tin POWMOD.INP và xuất kết quả ra tệp tin POWMOD.OUT.
Lưu ý: Vui lòng dùng freopen bình thường để đọc ghi (như code mẫu khi chấm Themis).
Mẹo: Bạn hoàn toàn có thể dùng lệnh ios_base::sync_with_stdio(false); cin.tie(NULL); đi kèm với freopen để tăng tốc độ đọc ghi dữ liệu lớn!
Bình luận