适用题目
适用于类斐波那契数列问题。需要递推来确定关系。
综上所述,我们需要做的是列出初始条件的 F 矩阵,如F(1) = 1, F(2) = 1等初始情况;然后找到 A 矩阵 ,用于求幂,最后我们算好 即可。
矩阵快速幂模板
这里使用了斐波那契数列为例子。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int M = 2; //A矩阵的维度
struct Matrix{
int a[M][M];
Matrix(){ //初始化
memset(a, 0, sizeof(a));
}
//可以转化,也可以不转,根据需求
void unit(){
a[0][0] = a[1][1] = 1;
a[0][1] = a[1][0] = 0;
}
//乘法的算符重载
Matrix operator*(const Matrix &B) const {
Matrix ans;
for(int i = 0; i < M; i++){
for(int j = 0; j < M; j++){
for(int k = 0; k < M; k++){
ans.a[i][j] += a[i][k] * B.a[k][j];
}
}
}
return ans;
}
//类似整数快速幂的操作
Matrix operator^(int n) const {
Matrix ans;
ans.unit();
Matrix A = *this;
while(n){
if(n & 1){
ans = ans * A;
}
A = A * A;
n >>= 1;
}
return ans;
}
void show(){
cout << "Matrix" << endl;
for(int i = 0; i < M; i++){
for(int j = 0; j < M; j++){
cout << a[i][j] << " ";
}
cout << endl;
}
}
};
int main(){
//A
//0 1
//1 1
Matrix A;
A.a[0][0] = 0;
A.a[0][1] = A.a[1][0] = A.a[1][1] = 1;
A.show();
//F
//1 0
//1 0
Matrix F;
F.a[0][0] = F.a[1][0] = 1;
F.a[0][1] = F.a[1][1] = 0;
F.show();
int n = 8;
Matrix ans = (A^n)*F;
ans.show();
return 0;
}