快速幂
利用了二进制的特性,话说二进制真有用。。(还有个矩阵快速幂)
时间复杂度:O(log n)
模板:
ll quick_pow(ll x,ll y)
{
ll ans =1;
while(y)
{
if(y&1)
ans =(ans*x)%mod;
x =(x*x)%mod;
y >>=1;
}
return ans;
}
龟速乘
求快速幂时,当两个1e9的数相乘时会爆掉long long,这时就有了龟速乘完美的避免了这个问题。(你也可以手写高精度解决这个问题)
时间复杂度:O(log n)
模板:
ll quick_mull(ll x,ll y)
{
ll ans =0;
while(y)
{
if(y&1)
ans =(ans+x)%mod;
x =(x+x)%mod;
y >>=1;
}
return ans;
}
快速乘
利用了long long和long double 的精度,有精度损失问题,不建议使用。
时间复杂度:O(1)
贴个板子:
ll quick_mul(ll a,ll b,ll mod) {
return ((a*b-(ll )((ld)a*b/mod)*mod+mod)%mod);
}