快速冪運算 c

2021-09-13 17:17:47 字數 1486 閱讀 9901

如果要求 a^b %m 簡單的用迴圈就能出來,但是複雜度 o(b)在,a,b很大的時候複雜度就很高了,在演算法筆記上介紹了兩種演算法

1.遞迴思想

快速冪基於二分的思想,有時也稱二分冪

(1) 如果b是奇數,那麼 a^b=a * a^b-1

(2)如果b是偶數,那麼a^b=a ^b/2 * a ^b/2

這樣在log(b) 級別的次數轉換後,就可以把 b 變成0 ,而任何正整數的0次方都是1 ,這也是遞迴的邊界

比如x ^ 10

x ^ 5 -> x * x ^ 4 求 x ^ 4

x ^ 4 -> x ^ 2 **x ^ 2 求 x ^ 2

x ^ 2 -> x^1 * x ^ 1 求 x ^ 1

x ^ 1 -> x * x ^ 0 結束

typedef long long ll;

ll binarypow(ll a, ll b, ll m)

}

& 是與運算 ,這樣執行更快,也可以寫成 b % 2 == 1

遞迴的時候不要寫成 binarypow(a,b/2,m) %m * binarypow(a,b/2,m) %m,這樣複雜度會變高

2.迭**法

比如 2 ^ 13 可以寫成 13 = 2^3 + 2^2 + 2 ^0

而13 的二級制是 1101 正好對應 冪次 ,也就是說如果當前的二進位製上為1就表明22i有數,就要乘上對應的數字,其實很好理解

typedef long long ll;

ll binarypow(ll a, ll b, ll m)

return ans;

}

快速冪的遞迴寫法和迭**法 效率都差不多 看你個人喜歡哪一種

有一道水題用遞迴寫的,雖然很簡單,但是第一次寫的時候沒大有思路,正好其中有一步和遞迴的寫法相似

//水序列

//描述

////有個水序列如下:1 1 2 2 5 9 12 …其通項公式為f(n) = f(n-1)+f(n-2)-f(n-3) ( 4 <= n <= 30)此時,如果f(n)為奇數,還要再乘以2再減去1。給出乙個整數n,請你求出該序列第n個位置上的元素。

////

//輸入

////多組輸入,每行乙個整數n。

////

//輸出

////對每組輸入,單獨輸出一行,為第n個位置上的元素。

////

//輸入樣例 1

////2

//3//4

//5//輸出樣例 1

////1

//2//2

//5#include#includeusing namespace std;

int f(int n)

}int main(){

int n;

while(scanf("%d",&n) != 0){

cout《遞迴的寫法比一開始接觸寫的熟練多了,但是還是要勤於練習

快速冪運算

知識點 快速冪運算 快速冪運算 原來 當我們計算a k時候,一定是 a a a a a k個 現在 把k拆成二進位制,為了表達清楚,我們這裡讓k 11 11 dec 1011 b 1 2 3 0 2 2 1 2 1 1 2 0 我們會發現其中有0的地方是個廢操作 那麼我們將去除這個廢操作的過程叫做快...

快速冪運算

如果我們要求x n次方 當n很大的時候 會gg 這個時候就會用到快速冪演算法了,顧名思義,快速冪,快速求冪。因為任何乙個數都可以用2進製表示。比如9 2 3 2 0 7 2 2 2 1 2 0 所以我們可以把n看成 n 2 k1 2 k2 2 k3.這樣來表示。當然我們同樣可以把x用這樣表示。即 x...

快速冪運算

首先,快速冪的目的就是做到快速求冪,假設我們要求a b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o b 也即是o n 級別,快速冪能做到o logn 快了好多好多。它的原理如下 假設我們要求a b,那麼其實b是可以拆成二進位制的,該二進位制數第i位的權為2 i 1 例如當b 11時 a1...