思路一:
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;
}
文章介绍了在处理可能超出longlong范围的大整数乘法时,使用longdouble进行优化的方法,以及与快速幂类似的二进制分解法,两种方法都能保持O(1)的时间复杂度,适用于特定的卡常数问题。
1万+

被折叠的 条评论
为什么被折叠?



