快速幂
原理
把指数 \(b\) 拆成二进制,利用 \(a^{x+y}=a^x\cdot a^y\),将 \(a^b \bmod mod\) 的 \(O(b)\) 暴力乘法优化到 \(O(\log b)\)。
\[a^b \bmod mod
\]
将 \(b\) 写成二进制:\(b = b_0\cdot2^0+b_1\cdot2^1+\dots+b_k\cdot2^k\)
\[a^b = a^{b_0\cdot2^0}\cdot a^{b_1\cdot2^1}\cdots a^{b_k\cdot2^k}
\]
循环每次把底数平方,若当前二进制位为1,则把底数乘入答案。
运用
求快速幂
直接计算 \(a^b \bmod mod\),指数 \(b\) 可以极大。
乘法逆元
配合费马小定理
模数 \(p\) 为质数时,\(a^{-1}\equiv a^{p-2}\pmod p\),调用快速幂计算。
模版
typedef long long ll;
ll qpow(ll a,ll b,ll mod){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
例题
P2613
题目:给出 \(a,b\),求 \(\dfrac{a}{b} \bmod 19260817\),模数\(19260817\)为质数。
式子:
\[\frac{a}{b} \equiv a \times qpow(b,mod-2,mod) \pmod{mod}
\]
片段
const int mod=19260817;
ll \(a,b\);
cin>>a>>b;
ll ans=a%mod * qpow(b,mod-2,mod)%mod;

快速幂
浙公网安备 33010602011771号