快速乘模板
问题描述
求 \(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;
}