快速幂(应用:快速幂求逆元)
快速幂
(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 = '\n';
//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}\)
\(\because\) a 和 p互质
\(\therefore\) 两边同时约去 a,得 \(b \cdot b^{-1} \equiv 1 \pmod {p}\)
由费马小定理 \({a}^{p-1} \equiv 1\pmod {p}\),可得 \(b^{-1}\) 为 \(b^{p-2} \pmod {p}\)。
要求:p 一定是质数,b 不是 p 的倍数。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步