Hướng dẫn cho Số dư


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

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(\mod⁡M)\) (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(\mod⁡M)\) (2)

Nhân hai đồng dư thức (1) và (2) ta được:

\((A^B/C).C.C^{-1}≡r(\mod⁡M) ⇔A^B.C^{-1}≡r(\mod⁡M)\)

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

Không có bình luận nào.