龟速乘(防止爆long long)
快速乘
在某些乘数特别大的情况,比如题目给定的模数大于 ,在之后的乘法计算中可能会爆 ,可以使用 快速乘在不爆 的情况下算出取模后的值。
typedef long long ll;
inline ll mul(ll a,ll b,ll mod){
return (a*b-(ll)((long double)a/mod*b)*mod+mod)%mod;
}
龟速乘
更多情况下,如果模数稍微比 大,如 ,同样会爆long long,这时候可以使用龟速乘,也就是把 拆分成二进制,一边加一边取模。
typedef long long ll;
ll mul (ll a, ll b, ll mod) { // 防止爆long long
if(b < 0) a = -a, b = -b;
ll s = 0;
for (; b; b >>= 1, a = (a + a) % mod)
if (b & 1) s = (s + a) % mod;
return s;
}
本文作者:Horb7
本文链接:https://www.cnblogs.com/Rainea/p/15581137.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步