思路一:
a*b%p,当a*b可能会超过 long long 范围,我们可以用long double 优化;
a*b%p=a*b-(a*b/p)*p;
时间复杂度为O ( 1 ) ,适合用于卡常数的题目。
代码:
LL mul(LL a, LL b, LL mod) {
LL ans = (a * b - (LL)((long double)a / mod * b + 1e-8) * mod);
return ans < 0 ? ans + mod : ans;
}
思路二:
与快速幂类似,将b二进制分解;
代码:
LL mul(LL a, LL b, LL mod)
{
LL ans = 0;
while (b)
{
if (b & 1)
ans = (ans + a) % mod;
b = b >> 1;
a = (a + a) % mod;
}
return ans;
}