快速冪(遞迴和非遞迴演算法)

2021-10-06 22:00:21 字數 1034 閱讀 6717

快速冪(exponentiation by squaring,平方求冪)

:簡單而高效地計算方法,演算法的時間複雜度是o(log n)。

例題:3的5次方如何計算呢?(a的n次方%p)

方法一:33333=243(進行四次連乘,複雜度為o(n-1),適用於a,n都很小的情況。

方法二(遞迴演算法):a的n/2次方a的n/2次方a。即a的n-1次方*a。

模板:

#include

//遞迴模板求快速冪;複雜度o(log n)

using

namespace std;

#define ll long long

const

int mod=

1e9+7;

ll qpow

(int a,

int n)

else

if(n &1)

//為奇數

else

//為偶數

}int

main()

方法三(非遞迴演算法):3的5次方按照3的(0101)二進位制權值展開計算。

模板:

#include

//非遞迴求快速冪模板;複雜度o(log n)

using

namespace std;

#define ll long long

const

int mod=

1e9+7;

ll qpow

(int a,

int n)

a =a*a%mod;

//a自乘

n >>=1;

//n右移一位

}return ans % mod;

}int

main()

演算法提高 遞迴 快速冪

理解遞迴的想法不難,關鍵是如何 快速 寫出 正確 高效 的遞迴。函式遞迴呼叫的基本形式 type myfunction 下面以遞迴實現 快速冪 說明一下寫遞迴的一些注意點,這些要點是不是必要的我不知道,我想這需要嚴格的證明。一般求冪的方法是呼叫中的pow 函式,例如求 如果要造輪子的話,一種想法是用...

遞迴 快速冪

題目 x yx y xy當y很大,採用如下方式 f x,frac times f x,frac y 2 0,y 0 1,y 0 f x,frac times f x,frac times x y 2 1,y 0 end right.f x,2 y f x,2y y 2 0,y 0 1,y 0f x ...

快速排序演算法 遞迴模板和非遞迴模板

就是一種對於氣泡排序的改進,基本思想是選取乙個記錄作為標記,經過一次排序,將整個序列分成兩部分,其中一部分值小於標記值,另外一部分大於標記值。然後再對於兩部分分別進行排序,從而使整個序列有序。遞迴實現思想 確定分界點 陣列排序q 用來進行比較的分界點,一般來說可以是最左邊的left q l x,或者...