Hướng dẫn cho Số dư
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Gọi \(r=(A^B/C)\%M\), ta có:
\((A^B/C) ≡ r(\modM)\) (1)
Mặt khác do \(C, M\) là nguyên tố cùng nhau nên tồn tại số nghịch đảo \(C-1\) của \(C\) theo \(modun\ M\), tức là:
\(C.C^{-1}≡1(\modM)\) (2)
Nhân hai đồng dư thức (1) và (2) ta được:
\((A^B/C).C.C^{-1}≡r(\modM) ⇔A^B.C^{-1}≡r(\modM)\)
Tức là:
\((A^B/C)\%M=(A^B.C^{-1})\%M\)
Một điều chú ý nữa là việc tính tích $A^B.C^{-1} hoặc \((A^B\%M).(C^{-1}\%M)\) có thể cho kết quả lớn hơn giá trị kiểu LL trong C++ (hoặc int64 trong Pascal). Vì vậy ta cần xử lý vấn đề này như sau, không cần phải dùng đến số lớn.
Ta có:
\((a.b)\%M=(a.(5.[b/5]+b\%5))\%M\)
=\((5.a.[b/5]+a.(b\%5))\%M=(5((a.[b/5])\%M)+a.(b\%5))\%M\)
Chú ý rằng trong công thức trên có thể thay số 5 bằng số 2, 3, ..., 9 đều được, nhưng nếu thay bằng số lớn hơn 9 thì không được, vì có thể bị tràn số.
Bình luận