數論之快速冪

2021-08-21 15:32:09 字數 2075 閱讀 6569

一、快速冪是什麼?

如果要計算a的b次方,在學習快速冪之前我的第一想法一定是直接暴力求解,這種方法雖然直接,但是卻有很多缺點,如演算法複雜度過高以及時間複雜度過高,當資料太大時容易造成資料的漏出,為了解決這種煩惱,快速冪就此誕生

以下是快速冪的模板

#include using namespace std;

typedef long long ll;

//遞迴寫法

ll pow_mod(ll a,ll b)//計算a的b次方

//迴圈寫法

ll pow_mod(ll a,ll b)//計算a的b次方

a=a*a;

b/=2;

}return ret;

}

從偽**中我們可以總結出快速冪的思想,其實就是將a的b次方轉換為a的平方的b/2次方,然後依次遞迴直到b為零時。值得注意的是當b為奇數時,應在原本的基礎上在乘一次a,因為計算機計算b/2時所得的結果是(b-1)/2,因此在計算快速冪時,我們少乘了一次a。

除了遞迴寫法與迴圈寫法以外,還有一種寫法是時下最為流行的寫法,及二進位制位運算寫法,以下是偽**

ll pow_mod(ll a,ll b)//計算a的b次方

return ret;

}

雖然我們知道了快速冪如何使用,但是在一般情況下acm比賽時是沒有直接只計算快速冪的,最為平常的就是快速冪取模。

在理解掌握快速冪取模之前我們要先了解有關取模的知識點

a的b次方 mod c=(a mod c)的b次方 mod c;

(a*b) mod c=[(a mod c)*(b mod c)] mod c;

a的b次方 mod c=【(a的平方)的b/2次方】 mod c=【(a的平方) mod c】的b/2次方 mod c(b是偶數)

a的b次方 mod c=【(a的平方)的b/2次方*a】 mod c=【(a的平方) mod c*a】的b/2次方 mod c(b是奇數)

有了上述公式後,我們就可以按照快速冪的思想來計算快速冪取模,無非是在計算多次方式加上取模運算罷了,以下是偽**

#include using namespace std;

typedf long long ll;

//迴圈寫法

ll pow_mod(ll a,ll b,ll c)

return ret;

}//遞迴寫法

ll pow_mod(ll a,ll b,ll c)

//位運算寫法

ll pow_mod(ll a,ll b,ll c)

return ret;

}

學習了快速冪的思想後,我發現快速冪可以拓展出快速乘,因為思路是一樣的,所以只將二進位制寫法的偽**寫一下

​ll mul(ll a,ll b,ll p)//快速乘,計算a*b%p

return ret;

}​

在訓練的最後,我又學習到了乙個十分神奇的演算法,叫做矩陣快速冪(其實也是快速冪的拓展)

矩陣快速冪的應用一般在計算有一定規律的數列,如斐波那契數列f(n)=f(n-1)+f(n-2),可以通過構造矩陣來進行矩陣的快速冪乘,從而得到f(n)的值

[ f(n),f(n-1) ]=[ f(n-1),f(n-2) ]*a   a[0][0]=1,a[0][1]=1,a[1][0]=1,a[1][1]=0;

下面我們以斐波那契數列為例來計算f(n)的值

//因為數值太大所以答案對100000007取模

#include #define mod 100000007

using namespace std;

const int n=2;

typedef long long ll;

//構造矩陣結構體

struct matrix

};matrix operator*(matrix x,matrix y)

return ans.m[0][1]%mod;

}int main()

{ int n;

cin>>n;

cout《今天就學習了這麼多,就先到這裡吧。

數論 快速冪

快速冪 演算法介紹演算法利用了二分的思想,可以達到o logn 可以把b按二進位制展開為 b p n 2 n p n 1 2 n 1 p 1 2 p 0 其中p i 0 i n 為 0 或 1 這樣 a b a p n 2 n p n 1 2 n 1 p 1 2 p 0 a p n 2 n a p ...

數論 快速冪

沒看懂,先記著 轉 typedef long long ll ll mod ll qpow ll a,ll n 計算a n mod return re mod struct matrix 定義乙個結構體,方便傳遞值 maxn和mod由全域性定義,其中mod根據需要可以省去 matrix mat mu...

數論 快速冪

在上一期時間複雜度優化的文章中就已經提到過了快速冪,這一期就來講一講快速冪。什麼是快速冪?快速冪正如其名,就是快速的冪,快速 是指這種方法運算速度很快,冪 就不用說了,a的b次方的結果,也就是b個a相乘 一提起冪,大家一定會不約而同的想到 include這個標頭檔案和pow函式,但是如果不讓你用這個...