思想与整数快速幂类似,这里有一篇博客写的很详细,这里就不再重复整理了。
模板
#include <stdio.h>
#include <cstring.>
typedef struct Matrix
{
int m[3][3];
}Matrix;
Matrix multiple(Matrix a,Matrix b,int n)
{
Matrix res;
memset(&res,0,sizeof(res));//初始化
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
for(int k = 0;k<n;k++)
res.m[i][j] += a.m[i][k]*b.m[k][j];
return res;
}
Matrix quick_pow(Matrix a,int N,int n)//N表示求a的几次幂,n表示阶数
{
Matrix res;
//初始化为单位矩阵
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
if(i == j) res.m[i][j] = 1;
else res.m[i][j] = 0;
while(N)
{
if(N&1)
res = multiple(res,a,n);
a = multiple(a,a,n);
N = N>>1;
}
return res;
}