问题描述
求 (a) 乘 (b) 对 (p) 取模的值。
(1≤a,b,p≤10_{18})
问题分析
(a * b)会爆炸long long,考虑将b视为二进制数,只需要执行(log_b)次加法并实时取模即可不爆long long完成乘法的计算
代码实现
#include <iostream>
using namespace std;
typedef long long LL;
LL qmul(LL a, LL b, LL p)
{
LL res = 0;
while (b)
{
if (b & 1) res = (res + a) % p;
a = (a * 2) % p;
b >>= 1;
}
return res;
}
int main()
{
LL a, b, p;
cin >> a >> b >> p;
cout << qmul(a, b, p) << endl;
return 0;
}