zoukankan      html  css  js  c++  java
  • 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的每一位都乘进答案里即可。

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

  • 相关阅读:
    小的面试题
    email
    网络
    进程,线程
    周日作业
    Python_day9
    Python_day8
    假期作业
    12/13
    Python_day7
  • 原文地址:https://www.cnblogs.com/maomao9173/p/13779285.html
Copyright © 2011-2022 走看看