题目描述
求 a 乘 b 对 p 取模的值。
输入格式
第一行输入整数 a,第二行输入整数 b,第三行输入整数 p。
输出格式
输出一个整数,表示 a*b mod p
的值。
数据范围
1 ≤ a , b , p ≤ 1 0 18 1 ≤ a , b , p ≤ 10^{18} 1≤a,b,p≤1018
输入样例:
3
4
5
输出样例:
2
解题思路
本题目可以使用将数字转换为字符串,然后通过加法原理求得结果。
但是本题目是有窍门的,原因在于 a、b、p 的取值范围可以使用 unsigned long long 存储。
如图是常见整型的最大取值数:
对于 a^b 存在快速幂乘,同样对于 a * b 也有类似的方法。
#include <iostream>
using namespace std;
int main()
{
unsigned long long a,b,p;
cin >> a >> b >> p;
unsigned long long result = 0,base = a;
while(b)
{
if(b&1)
{
result = (result + base) % p;
}
b >>= 1;
base = (base + base) % p;
}
cout << result << endl;
return 0;
}