目录
快速幂
算法推导
假设现在要求 a^b,我们可以用一个 for 循环循环 b 次累乘出结果,还可以用快速幂的方法,假设 b == 11:

即:先写出 b 的二进制表示,如果 b 的二进制表示的某一位是 1,就累乘上 a 的该位置二进制位权次方
模板
cpp
#include <iostream>
using namespace std;
typedef long long LL;
LL qpow(LL a, LL b, LL p)
{
LL ret = 1;
while (b)
{
if (b & 1) ret = ret * a % p; // 处处取模防止溢出
a = a * a % p;
b = b >> 1;
}
return ret;
}
LL a, b, p;
int main()
{
cin >> a >> b >> p;
printf("%lld^%lld mod %lld=%lld", a, b, p, qpow(a, b, p));
return 0;
}
快速积
现在要求 a*b % p ,但 1 ≤ a,b,p ≤ 10^18,即 a 如果直接乘 b,结果会溢出,可以使用 for 循环循环 b 次累加 a,也可以使用快速积:

cpp
#include <iostream>
using namespace std;
typedef long long LL;
LL qmul(LL a, LL b, LL p)
{
LL ret = 0;
while (b)
{
if (b & 1) ret = (ret + a) % p; // 处处取模防止溢出
a = (a + a) % p;
b = b >> 1;
}
return ret;
}
LL a, b, p;
int main()
{
cin >> a >> b >> p;
printf("%lld",qmul(a, b, p));
return 0;
}