[模板] 快速幂和龟速乘和快速乘

快速幂

用于较快计算幂

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)\)

posted @ 2020-07-24 18:41  ChPu437  阅读(130)  评论(0编辑  收藏  举报