1. 问题描述:
求 a 乘 b 对 p 取模的值。
输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出格式
输出一个整数,表示a * b mod p的值。
数据范围
1 ≤ a,b,p ≤ 10 ^ 18
输入样例:
3
4
5
输出样例:
2
来源:https://www.acwing.com/problem/content/description/92/
2. 思路分析:
因为a和b最大是10 ^ 18, 所以对于c/c++/java等语言直接相乘会溢出(c++语言中long long最大为19位十进制数字,所以相乘肯定会爆掉),这个时候可以使用高精度或者是龟速乘来解决,下面使用龟速乘来解决(龟速乘比较方便一点),龟速乘类似于快速幂的思想,快速幂实现的是a ^ k % p,其中使用到了反复平方的思想将乘方转换为乘法的形式,龟速乘也是类似的思想,将a * b转换为b个a相加,将乘法转换为了加法的形式,也即a * b = (a + a + ... + a) % p。
3. 代码如下:
龟速乘:
class Solution:
# 类似于快速幂的思想, 将乘法转换为加法来求解
def quickadd(self, a: int, b: int, p: int):
res = 0
while b:
if b & 1:
res = (res + a) % p
a = (a + a) % p
b >>= 1
return res
def process(self):
a = int(input())
b = int(input())
p = int(input())
return self.quickadd(a, b, p)
if __name__ == "__main__":
print(Solution().process())
直接相乘(python不会出现溢出的情况):
class Solution:
# 高精度或者龟速乘都可以解决
def process(self):
a = int(input())
b = int(input())
p = int(input())
return a * b % p
if __name__ == '__main__':
print(Solution().process())