CH0101 a^b 【快速幂的两类理解】

//CH0101 2020/10/7 20:22
#include <bits/stdc++.h>
using namespace std;

int a, b, p;

int add (int x, int y, int mod) {
    return (0ll + x + y) % mod;
}

int mul (int x, int y, int mod) {
    return (1ll * x * y) % mod;
}

int qpow (int x, int y, int mod) {
    if (x == 0) return 0;
    int ret = 1;
    while (y) {
        if (y & 1) {
            ret = mul (ret, x, mod);
        } 
        y >>= 1;
        x = mul (x, x, mod);
    } 
    return ret % mod;
}

int main () {
    cin >> a >> b >> p;
    cout << qpow (a, b, p) << endl;
}

对于快速幂的理解:

第一类理解:

· y为奇数 -> 【(ans = x ^ {y})】 -> 【(ans = (ans * x) * (x ^ {y - 1}))】,从奇数次幂里面剥离一个1,并把一个x乘到ans里面。

· y为偶数 -> 【(x = x * x,y = y / 2)】,原理是y为偶数时【(x^{y}=(x^{y / 2})^{2})

第二类理解:

· b可以表示为二进制数:(b=∑{c_i * 2^{i}})(c_i)代表b每一位0/1

· (a^{b} = a ^ {∑{c_i * 2^{i}}} = prod{a^{c_i * 2^{i}}}),把b的每一位都乘进答案里即可。

两者具有相同的代码,但思想截然不同。

原文地址:https://www.cnblogs.com/maomao9173/p/13779285.html