快速幂
(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 的倍数。