快速幂 思想及代码

根据二进制来求,优化成 O ( l o g N ) O(logN) O(logN)

比如 2 10 2^{10} 21010的二进制是1010,也就是说 2 10 = 2 101 0 2 = 2 2 3 ∗ 2 2 1 2^{10} = 2^{1010_2} = 2^{2^3} * 2^{2^1} 210=210102=223221

发现:将10的二进制1010从后向前看,如果遇到1乘到答案

base是代表二进制中k位的: a k a^k ak, 承接上一句,如果遇到1就把**$a^k$乘到答案**上

#include <iostream>
using namespace std;

int f(int a, int b, int mod)
{
    
    
    int ans = 1;
    int base = a;
    while (b)
    {
    
    
        if (b & 1) // 看是否该乘到答案
            ans = (ans * base) % mod;
        base = (base * base); // a的k次幂
        b >>= 1; // 将b看完
    }
    return ans % mod;
}
int main()
{
    
    
    int a, b, mod;
    cin >> a >> b >> mod;
    cout << f(a, b, mod);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45653525/article/details/113623890