一、快速冪是什麼?
如果要計算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函式,但是如果不讓你用這個...