Tính tổ hợp modulo¶
Yêu cầu¶
Tính tổ hợp modulo \(C(n, k) \pmod{10^9 + 7}\).
Input¶
Ouput¶
Cách giải đề xuất¶
Ý tưởng chính¶
Ta có:
C(n, k) = \frac{n!}{k!(n-k)!} = n! \cdot (k!(n-k)!)^{-1}
Định lý Fermat nhỏ (Fermat's Little Theorem) phát biểu rằng:
\(a^p \equiv a \pmod p\)
Suy ra nếu \(a\) không chia hết cho \(p\) thì:
\(a^{p-1} \equiv 1 \pmod p\)
Nhân cả hai vế với \(a^{-1}\), ta được:
\(a^{p-2} \equiv a^{-1} \pmod p\)
Điều này có nghĩa rằng \(a^{p-2}\) là nghịch đảo modulo \(p\) của \(a\).
Như vậy, ta cần có các hàm sau:
- Hàm tính nghịch đảo modulo
- Hàm tính luỹ thừa modulo
- Hàm tính tổ hợp modulo
Viết chương trình¶
Bước 1:
Viết hàm tính nghịch đảo modulo.
Bước 2:
Viết hàm tính luỹ thừa modulo power_modulo()
.
Bước 3:
Viết hàm tính tổ hợp modulo.
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.