快速冪
當遇到求
a
na^n
an這種問題時,可以將指數n拆開於是變成
( a2
)n/2
(a^2)^
(a2)n/
2。然後重複將n除2,底數平方,直到指數為0為止就是結果。於是解決這題的時間複雜度從
o (n
)o(n)
o(n)
(普通迴圈相乘a的做法)到了
o (l
ogn)
o(logn)
o(logn
)。這就是快速冪演算法,本身還是挺簡單的,主要思想就是讓底數變大,指數不斷縮小。
唯一要考慮的就是當n是奇數時需要將式子變成
a ∗a
n−
1a*a^
a∗an−1
,然後再n除二,底數平方(因為小數次方計算機不好計算),**如下。
intf(
int a,
int n)
else
}return ans;
}
可是滑稽的是因為指數**,a=2 n等於64時的結果便超過了長整形的資料範圍,所以這個演算法並沒有卵用,所以這個模板只適用於大數模擬的快速冪,或者將這個演算法與快速冪求餘一起討論。
快速冪取餘
當遇到求an%
ba^n\%b
an%b
這種問題時,可以利用求餘的基本運算法則,基本運算法則如下:
1. (a
+b)%
c=(a
%c+b
%c)%
c1.(a+b)\%c=(a\%c+b\%c)\%c
1.(a+b
)%c=
(a%c
+b%c
)%c2.(a
−b)%
c=(a
%c−b
%c)%
c2.(a-b)\%c=(a\%c-b\%c)\%c
2.(a−b
)%c=
(a%c
−b%c
)%c3.(a
∗b)%
c=(a
%c∗b
%c)%
c3.(a*b)\%c=(a\%c*b\%c)\%c
3.(a∗b
)%c=
(a%c
∗b%c
)%c類似於普通四則運算,不過沒有除法。
第三點可以容易證明ab%
c=(a
%c)b
%c
a^b\%c=(a\%c)^b\%c
ab%c=(
a%c)
b%c
利用這點和快速冪演算法就可把此問題中的指數除二得到((a
2)n/
2)%b
=((a
2%b)
n/2)
%b
((a^2)^)\%b=((a^2\%b)^)\%b
((a2)n
/2)%
b=((
a2%b
)n/2
)%b (n為偶數),接下來就是和快速冪的做法一樣了,將n不斷縮小直至為1為止,同樣也要考慮奇數,所以**只需稍作修改如下。
intf(
int a,
int n,
int b)
else
}return ans%b;
//多求餘一次防止n等於0時出現意外錯誤
}
以上便是快速冪取模,複雜度同樣是o(l
ogn)
o(logn)
o(logn
)。要注意的是b
2b^2
b2不能超出資料範圍,不然會溢位。
快速冪取模可以常見使用於求某乙個a
na^n
an的後幾位數,比如an%
1000
a^n\%1000
an%100
0就是得到後三位數的值。
快速冪取餘
應用 快速計算出a的n次方對mod取餘 對於計算a的n次方,暴力的方法時間複雜度是o n 對於n 1e8的情況下已經不能使用了 我們知道a的n次方可以寫成 所以只要想辦法找出b陣列即可 我們考慮到乙個數使用二進位制表示的特點,對於乙個數的二進位制表示為1的位次分別是第i1 i2 i3 ik,則n 例...
快速冪 取餘運算
給你三個整數 b,p,k,求 b p mod k。輸入只有一行三個整數,分別代表 b,p,k。輸出一行乙個字串b p mod k s,其中b,p,k分別為題目給定的值,s為運算結果。對於100 的資料,保證0 leq b,p leq 2 1 leq k leq 2 快速冪的模板題,沒有什麼好說的。有...
快速冪和取餘
poj 1995 需要的知識,快速冪和取模的運算 1 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 b p 5 a b p c p a b c p p ab p c p a bc p p a b p c p a c p b c p...