快速幂与模逆元:基于费马小定理
【算法解析】
● 费马小定理:若 p 为质数,且整数 a 满足 gcd(a,p)=1,则 aᵖ⁻¹≡1 (mod p)。
费马小定理表明,在模质数 p 下,a 的 p-1 次幂同余于 1。
● 快速幂与模逆元的联系(a⁻¹ ≡ aᵖ⁻² (mod p),其中 p 为质数)
(1)逆元定义:若 ax≡1(mod p),则 x 称为 a 的模 p 逆元,记作 a⁻¹。
(2)逆元求解:由费马小定理 aᵖ⁻¹≡1 (mod p) 知 a×aᵖ⁻²≡1 (mod p)。据此可推导出 a 的逆元 a⁻¹ ≡ aᵖ⁻² (mod p),其中 p 为质数。
(3)模数约束:模数 p 必须为质数。
● “取模”运算规则
(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p) % p
(a * b) % p = (a % p * b % p) % p
(a / b) % p = (a % p * inv(b) % p) % p,其中 inv(b) = bᵖ⁻² % p(当 p 是质数时)。
● 快速幂 → https://blog.csdn.net/hnjzsyjyj/article/details/143168167
快速幂,又称二进制取幂,是一个以 O(logn) 的时间复杂度计算 aⁿ 的小技巧。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int fastPow(LL a,LL b,LL p) {
LL ans=1;
while(b){
if(b & 1) ans=ans*a%p;
b>>=1;
a=a*a%p;
}
return ans%p;
}
int main() {
int a,b,p;
cin>>a>>b>>p;
cout<<a<<"^"<<b<<" mod "<<p<<"="<<fastPow(a,b,p)%p;
}
/*
in:2 10 9
out:2^10 mod 9=7
*/
【应用实例】
洛谷 B2164:组合数问题 → https://blog.csdn.net/hnjzsyjyj/article/details/160095303
洛谷 P5104:红包发红包 → https://blog.csdn.net/hnjzsyjyj/article/details/159692341
AcWing 886:求组合数 II → https://blog.csdn.net/hnjzsyjyj/article/details/156121947
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/160095303
https://blog.csdn.net/hnjzsyjyj/article/details/159692341
https://blog.csdn.net/hnjzsyjyj/article/details/156121947
https://blog.csdn.net/hnjzsyjyj/article/details/143168167

浙公网安备 33010602011771号