快速冪是用來解決,將其時間複雜度從O(n)減少到O(logn)
原理
首先,瞭解一個模運算的概念
(a+b) mod N = (a mod N + b mod N) mod N
(a*b) mod N = (a mod N * b mod N) mod N
然後,對於一個數k,
把它轉換爲二進制,
如11 = 1011
那麼
於是
那麼在循環過程中只需要一直記錄,每次判斷對應k的二進制位是0(不要)是1(要)就可以
代碼
typedef long long ll;
ll quick_mod(ll n, ll k, ll N)
{
ll num = 1, t = n;
while(k){
if(k&1)
num = num * t % N;
t = t * t % N;
k>>=1;
}
return num;
}
對於快速冪的擴展還有一個矩陣快速冪,它是對於矩陣做一個快速冪的處理,可以用於求斐波那契數列第n項模N