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的每一位都乘进答案里即可。

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

posted @ 2020-10-07 21:06  maomao9173  阅读(118)  评论(0编辑  收藏  举报