快速幂
用于较快计算幂
ull quick_power(ull a,ull b,ull k){
ull ans = 1,base = a % k;
if(b==0 && k==1) return 0;//特判,除0以外任何数的0次方都是1,1模1得0
do{
if(b & 1){
ans = (ans * base) % k;
}
base = (base * base) % k;
b>>=1;
}while(b);
return ans;
}
龟速乘
用于乘法防爆
LL qmul(LL x, LL y, LL MOD){
LL ans = 0;
for( ; y; y >>= 1){
if(y&1 == 1){
(ans += x) %= MOD;
}
(x += x) %= MOD;
}
return ans;
}
两者可以结合使用,复杂度均为 (O(log n))
应该没有精度损失的魔法快速乘
LL mul(LL a, LL b, LL P){
LL L = a * (b >> 25LL) % P * (1LL << 25) % P;
LL R = a * (b & ((1LL << 25) - 1)) % P;
return (L + R) % P;
}
速度接近 (O(1))