快速冪計算(整數快速冪 矩陣快速冪)

2022-02-20 03:22:25 字數 1447 閱讀 6225

//*************快速冪計算****************************************

樸素演算法實現:

1 ll get_pow(ll x, ll n)  //

** (這裡的n要求不小於0,如果n小於0則令n=-n,並且最終返回1.0/ans即可)29

return

ans;

10 }

快速冪演算法:

原理:二分:

假設我們現在要計算pow(x,n),那麼有當n為偶數時pow(x, n)==pow(x*x, n/2),當n為奇數時,pow(x, n)==pow(x, n-1)*x, 此時n-1為偶數,可按前面的公式繼續迭代;

迴圈往復,即可計算出答案;

二進位制:

計算pow(x,n),先將n轉化為二進位制形式,n=2^a+2^b....

例如:計算pow(x,21),19=2^4+2^2+2^1;其中2^2可以由(2^1)*(2^1)得到,同理, 2^4可以由(2^2)*(2^2)得到;

所有有pow(x,21)==x^(2^4+2^2+2^1),其時間複雜度為o(long2(n));

以上兩種思路的出發點不同,不過其本質一致,**也相同;

**:

1 ll get_pow(ll x, ll n)  //

** (這裡的n要求不小於0,如果n小於0則令n=-n,並且最終返回1.0/ans即可)

210 x=(x*x)%max;

11 n>>=1;12

}13return

ans;

14 }

//*********************矩陣快速冪計算**********************************

矩陣快速冪和快速冪演算法原理一樣,只是操作物件換成了矩陣;

題目鏈結)

ac**:

1 #include 2

#define maxn 2

3#define mod 10000

4#define ll long long

5using

namespace

std;67

struct

matrix8;

1112 matrix temp=;

1314 ll n; //

***n為冪數,結果對mod取模

1516 matrix multi(matrix a, matrix b) //

***矩陣乘法

1728}29

}30return

c;31}32

33ll pow(ll n)

3446

return ans.x[0][1

];47}48

49int main(void)50

56return0;

57 }

快速冪(整數快速冪 矩陣快速冪)

1 整數快速冪 例如求x 8 就是x x x x x x x x 正常的運算方式是,x的值乙個個往上乘上去,乘法運算執行7次 x x x x x x x x 也可以採用這種運算方式,先進行乘法得到x 2再對x 2進行三次乘法。這種運算要明顯比第一種情況要快 所以對於整數快速冪,也是結合了這種思想 x...

快速冪 普通快速冪 矩陣快速冪

題意 n個人排隊,f表示女,m表示男,包含子串 fmf 和 fff 的序列為o佇列,否則為e佇列,有多少個序列為e佇列。分析 矩陣快速冪入門題。下面引用巨巨解釋 用f n 表示n個人滿足條件的結果,那麼如果最後乙個人是m的話,那麼前n 1個滿足條件即可,就是f n 1 如果最後乙個是f那麼這個還無法...

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...