Cho biết chữ số thứ k tính từ phải qua trái của n!
A=a.b
A mod m = ((a mod m) . (b mod m)) mod m
khi tích a x b rất lớn thì ta tính a mod m và b mod m để có thể lấy các a, b nhỏ hơn
- thay vì tính cả tích n!=1.2.3...n, bạn sẽ bị tràn bộ nhớ; khi đó bạn tính: ((1 mod m) . (2 mod m) ....) mod m và bạn có thể phân tách các tích ra nhỏ hơn nữa. Khi đó ta sẽ được kết quả là k chữ số cuối của n! (với m = 10^k). Công thức tổng quát: n! mod 10^k = (i mod 10^k ) mod 10^k, i=1, 2, ...n
- VD: n=10, k=1
| i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| i mod 10^1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
| (i mod 10^k ) mod 10^k, i=1, 2, ...n, bằng 0 |
=> như vậy 1 chữ số bên phải của 10! là 0
bây giờ muốn lấy chữ số thứ k của n! từ phải sang thì ta phải tính theo công thức: (T // 10^(k-1)) mod 10. VD: T=8800, k =3 thì chữ số thứ 3 từ phải qua trái của n! là: (8800 // 10^2) mod 10 = 8
Code minh họa
def chuSoThuKTuBenPhai(n, k):
m = 10**k
T = 1
for i in range(1, n+1):
T = (T * i) % m
return (T // 10**(k-1)) % 10
n = int(input("n= "))
k= int(input("k= "))
print(f"Chữ số thứ {k} từ phải của {n}! = {chuSoThuKTuBenPhai(n,k)}")
https://tritue.edu.vn/tuecode/tracnghiem30/site/data/YVdRc01qUXlMRjl5YjNWMFpTeGlZV2wyYVdWMEwzQnZjM1F2ZG1sbGR3PT0%3D