快速冪及快速冪取餘

2021-10-02 05:28:07 字數 2050 閱讀 3044

快速冪

當遇到求

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...