1.引入
//整數快速冪
為了引入矩陣的快速冪,我先看了求整數的冪,即x^n
例如求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^m)*(x^n)=x^(m+n)
x^19=(x^16)(x^2)(x^1)
//整數快速冪
int quickpow(int x,int n)
res = res*res;
n = n>>1;
}return ans;
}
我們用 x^19來走這個函式
舉例:x^19
19的二進位制為:1 0 0 1 1
初始:ans = 1 ; res = x ;
則10011最後1位是1,為奇數
ans = res *ans =x ;
res =res * res = x ^ 2 ;
然後右移一位,1001
最後一位為1,為奇數
ans = res*ans = x*(x^2) = x^3;
res = res*res = x^2*x^2 = x^4 ;
然後右移一位, 100
為偶數res = res*res = x^4*x^4 = x^8;
然後右移一位,10
為偶數res=res*res=x^8*x^8=x^16;
然後右移一位,1
為奇數ans = ans*res = (x^3)*(x^16) = x^19;
res = res*res = x^32
res=x^m,m始終是與二進位制位置上的權值是相互對應的。
當二進位制為0時候,我們只讓res*res使得冪指數乘2,對應下乙個二進位制權值;
當二進位制為1時候,我們讓ans=ans*res,乘上了x冪次。
2.矩陣快速冪
看完了整數快速冪之後,再來學習一下,矩陣快速冪,
設有乙個n*n的方陣a。
給出乙個數m,即計算矩陣a的m次冪 a^m
struct matrix //結構體,矩陣型別
ans,res;
//計算矩陣乘法的函式,引數是矩陣a,矩陣b和乙個n,代表這兩個矩陣是幾階方陣
maxtrix mul(maxtrix a,maxtrix b,int n)
//快速冪演算法,求矩陣res的n次冪
void quickpower(int n,int n)
while(n)
}
這是簡單的計算矩陣冪,在實際中的運用的話,
3.實際應用
我們以最為常見的斐波那契數列為例:
f[n]=f[n-1]+f[n-2]
f[0]=0,f[1]=1;
斐波那契數列是乙個遞推式求出來的
第n+1項由第n項和第n-1項遞推而來
因此可以用矩陣表示:
poj3070/nyoj148
給出了矩陣相乘的定義,要你求出斐波那契的第n項對1e4取餘。
#include #include #include #include using namespace std;
typedef long long ll;
const int mod=10000;
typedef vectorvec;
typedef vectormat;
mat mul(mat &a,mat &b)//表示不會這樣用,,,,}}
return c;
}mat pow(mat a,ll n)
return 0;
}
快速冪(矩陣快速冪)
求 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 會超時,這裡引入快速冪來...
快速冪 矩陣快速冪
快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...
快速冪 矩陣快速冪
快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...