快速幂(应用:快速幂求逆元)

快速幂

(1)快速幂

(a^k mod p)

时间复杂度:O((log)k)

https://www.luogu.com.cn/problem/P1226

题意:求 (a^k mod p)

#include <cstdio>
#include <iostream>
using namespace std;

typedef long long LL;

const char nl = '
';
//const int N =

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

int main(){
    ios::sync_with_stdio(false);
//    cin.tie(nullptr);

    int a, k, p;
    while (cin >> a >> k >> p){
        cout << a << '^' << k << " mod " << p << "=" << qmi(a, k, p) % p << nl; // 1^0 mod 1=0
    }
    return 0;
}

(2)快速幂求逆元

若 a 和 p 互质,求逆元(b^{-1}),满足 (frac{a}{b} equiv a cdot b^{-1} pmod {p})

两边同时乘以 b,得 (a equiv a cdot b cdot b^{-1} pmod {p})

(ecause) a 和 p互质

( herefore) 两边同时约去 a,得 (b cdot b^{-1} equiv 1 pmod {p})

由费马小定理 ({a}^{p-1} equiv 1pmod {p}),可得 (b^{-1})(b^{p-2} pmod {p})

要求:p 一定是质数,b 不是 p 的倍数。

原文地址:https://www.cnblogs.com/xiaoran991/p/14401380.html