//*************快速冪計算****************************************
樸素演算法實現:
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 會超時,這裡引入快速冪來...