快速幂

\(a^n\)

传统做法:\(a \times a \times ...\times a\),时间复杂度O(n)

快速幂算法:

\(5^{13} \to 5 \times 5^6 \times 5^6 \to 5 \times 15625 \times 15625\) 复用相同的数

\(2^8 \to (2^4)^2 \to 2^4 \times 2^4\)

\(2^4 \to 2^2 \times 2^2\)

时间复杂度O(log(n))

而对应的幂使用二进制的位值\(x^{22}=x^{16}\times x^4\times x^2\),其中22的二进制为10110

模板

基本快速幂

typedef long long ll;
//base代表底数,power代表指数
ll fastPower(ll base, ll power) {
	ll result = 1;
    while (power) {
		if (power & 1) { /*power按位与1,若结果为奇数,返回1(true),为偶数,
  返回0(false)根本目的是判断此时指数的奇偶性*/
			result = result * base;//逐位获取power的二进制位,遇0累乘
        }
        power >>= 1;/*power右移一位,即除二操作,此时不管奇偶,因为整数类型会删去小数部分*/
        base *= base;
    }
    return result;
}

但当结果过大时题目一般会要求求模,即求 m^k mod p

long long qmi(int m, int k, int p)
{
    long long res = 1 % p, t = m;
    while (k)
    {
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

高精快速幂

posted @ 2023-08-27 23:33  -37-  阅读(6)  评论(0编辑  收藏  举报