**:
int pow(int a,int n)
return rst;
}
相信初學者都是如此求冪的,其複雜度o(n),對於資料量大時便不再適用。
我們學習複雜度時,看到logn級別的複雜度,第一時間想到的便是二分思想,快速冪也是一種二分思想減小複雜度的演算法。
** :
int fastpow(int a,int k)
int ans = 1;
while (k)
return ans;
}
舉個例子來具體說明此**: 3^11
首先,將11寫作二進位制,即1011.則
所以**中的 (k&1) 即是取最後一位,如果是1,就 *a . 而每次 a *= a,則是 每位對應的 3 ^ 1 , 3 ^ 2 , 3 ^ 4……
而**中的 k>>=1 ,則是右移一位,保證每次取的都是新的最後一位。
我們打表來觀察一下計算 3^11的各個變數的具體值:
可以比較清晰的看出其中的每一步的變化。
首先是簡單的矩陣a的k次方的計算。從上面的整數的k次方計算可知,矩陣的k次方也是按照二進位制計算,不同的是需要過載矩陣的乘法運算即可。
1、矩陣結構體的定義
struct matrix
}matrix
(int n)
n = n;
clear()
;}void
unit()
}void
display()
cout<
void
operator=(
const matrix& tmp)
const}}
matrix operator*(
const matrix& tmp)
const}}
return ans;}}
;
2、接下來定義好矩陣結構體,並過載運算子之後,只要把快速冪裡的 int a, 換為 matrix a 即可。
matrix fastpow
(matrix base,
int k)
while
(k)return ans;
}
hdu 5015
分析都大同小異,在此只放上**以及出現的錯誤
1、**:
#include
using
namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define f first
#define s second
#define pb push_back
#define mk make_pair
typedef
long
long ll;
const
int maxn =10+
5;const
int mod =
1e7+7;
struct matrix
cout<
};matrix mulmatric
(matrix a, matrix b,
int p)}}
return ans;
}matrix fastpow
(matrix a,
int k,
int p)
matrix ans;
ans.row = a.row;
ans.col = a.col;
mem(ans.mat,0)
;for
(int i =
0; i < a.row; i++
)while
(k)return ans;
}int n,m;
intmain()
a.row = a.col = n+2;
mem(a.mat,0)
;for
(int i =
0;i < n+
1;i++
) a.mat[i][0
]=10;
for(
int i =
0;i <= n+
1;i++
) a.mat[i]
[n+1]=
1;for(
int i =
1; i <= n; i++)}
ans =
fastpow
(a,m,mod)
; ans =
mulmatric
(ans,b,mod)
; cout<
]<
}return0;
}
2、出現的錯誤
(1)特別特別要注意下標,因為此題中的關係矩陣是乙個 (n+2) * (n+2) 的矩陣
(2)注意在快速冪函式,以及矩陣乘法函式中,每次宣告 matrix ans,都要給其行和列賦值。並且每次都要初始化,不然都不預設是0.
矩陣快速冪題目的難點一般是找關係方程,不會直接讓你求乙個矩陣的幾次方。此題求冪和上面不同的是,乘法是矩陣乘法的一般形式,即 (n,k) 矩陣乘以 (k,m) 矩陣。除此之外還要注意的是取模運算的位置。
快速冪 快速矩陣冪學習
快速冪學習 計算3 11 如果用傳統計算,則是 for i 11 s 3 速度為n 這裡利用快速冪思想 3 11 3 1 3 2 3 8 3 1的平方就是3 2,再平方就是3 8 最後再將他們乘起來就是求出來的數了,速度也達到了log n 演算法中我們可以先判斷冪指數是否為奇數,先乘乙個3,然後對剩...
快速冪的初步學習
快速冪的用處很多,常見的問題有快速冪取模和矩陣快速冪,一般的問題套用模板就可以。快速冪的思想是分治,類似於二分,所以時間複雜度是o n 推薦一篇很好的文章 fzu 1752 a bmoc c 題意 given a,b,c,you should quickly calculate the result...
快速冪 普通快速冪 矩陣快速冪
題意 n個人排隊,f表示女,m表示男,包含子串 fmf 和 fff 的序列為o佇列,否則為e佇列,有多少個序列為e佇列。分析 矩陣快速冪入門題。下面引用巨巨解釋 用f n 表示n個人滿足條件的結果,那麼如果最後乙個人是m的話,那麼前n 1個滿足條件即可,就是f n 1 如果最後乙個是f那麼這個還無法...