直接上代码:
同快速幂思路一样,不过是将快速幂中的值相乘变成矩阵相乘!
struct Matrix //定义结构体
{
int m[maxn][maxn]; //矩阵
}ans,res; //结构体中的答案 ,和需要乘的值
Maxtrix Mul (Matrix A,Matrix B,int n){ //矩阵乘法
Matrix tmp;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tmp.m[i][j]=0;
}
} //矩阵初始化
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
tmp.m[i][j]+=A.m[i][k]*B.m[k][j];
}
}
} //线性代数中的矩阵乘法
return tmp;
}
void QuickPower(int N,int n){ //快速幂
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)ans.m[i][j]=1;
else ans.m[i][j]=0;
}
} //初始化ans 矩阵为 单位矩阵
while(N){ //开始
if(N&1){
ans=Mul(anx,res); //如果当前位为1 则需要乘当前位的
}
res=Mul(res,res); //每次进位!res*=res
N=N>>1;
}
}