01/10/2018, 11:53
Tính a ^ b mod M với a, b lớn
(a ^ b) % M
M = 1000000007 (1e9 + 7)
a, b <= 10^18
cho em hỏi có cách nào để chuyển phép toán trên ra chuỗi rồi in ra không?
Bài liên quan
(a ^ b) % M
M = 1000000007 (1e9 + 7)
a, b <= 10^18
cho em hỏi có cách nào để chuyển phép toán trên ra chuỗi rồi in ra không?
M = 1e9 + 7 là số nguyên tố rồi.
Bạn tìm hiểu về thuật toán tính số mũ (có mod) nhanh:
drgnz/diễn đànWiki/blob/master/Algorithm/Math/Modulo/modulo.md
This file has been truncated. show originalNgoài ra,
(a ^ b) % M = ((a % M) ^ b) % M
.nhập vào a=10^18, b=10^18 thì kq =0:cry:
Khi nhân 2 số lớn như vậy, đừng dùng pow, vì dùng pow sẽ rất dễ xảy ra tràn số.
(10^18)^(10^18) = 10^(18 * 10^18)
, quá to.Bước này giảm a từ 1018 xuống x còn cỡ ~109
Bước này giảm b từ 1018 xuống r còn cỡ ~109
Để tính ab lẹ thì ta xài cách tính ab/2 * ab/2, ở đây có mod m vẫn xài được, vì ab mod m = a mod m * b mod m.
Để tránh đệ quy thì ta phân tích b thành tổng của các số mũ 2.
Ví dụ b = 12345 thì b = 1 + 8 + 16 + 32 + 4096 + 8192, vậy a12345 = a1 + 8 + 16 + 32 + 4096 + 8192 = a1a8a16a32a4096a8192.
Để phân tích b ra thành tổng của các số mũ 2 thì ta chuyển b về nhị phân, từ đó ta biết được ở vị trí
i
nào (từ phải qua trái, bắt đầu từ 0) có số 1 thì tổng b có 1 số hạng 2i.Ví dụ ở đây b = (12345)10 = (11000000111001)2 có số 1 ở vị trí thứ 0, 3, 4, 5, 12, 13 từ phải qua thì tổng b = 20 + 23 + 24 + 25 + 212 + 213 = 1 + 8 + 16 + 32 + 4096 + 8192.
Java có sẵn kiểu BigInteger không mọi người? Có thì đỡ phải code.
Có luôn anh ơi:
BigInteger Class in Java - GeeksforGeeks
BigInteger class is used for mathematical operation which involves very big integer calculations that are outside the limit of all available primitive data types. For… Read More »
Nhưng mà nếu dùng BigInteger thì có vẻ không được ổn lắm.