二分求幂思想
注意点
1. 设置矩阵的结构体便于计算。
2. 注意初始化单位矩阵。
3. 二分求幂
int pow(int a,int b)
{
int ans=1;//对于矩阵:单位阵
while(b!=0)
{
if(b%2==1)
ans*=a;
b/=2;
a*=a;
}
return ans;
}
矩阵二分求幂代码
//矩阵二分求幂
#include<stdio.h>
struct matrix{
int size;
int mat[11][11];
};
void print(matrix a)
{
for(int i=0;i<a.size;i++){
for(int j=0;j<a.size;j++){
printf("%d\t",a.mat[i][j]);
}
printf("\n");
}
}
matrix multi(matrix a,matrix b)
{
matrix tmp;
tmp.size=a.size;
for(int i=0;i<tmp.size;i++){
for(int j=0;j<tmp.size;j++){
int v=0;
for(int k=0;k<tmp.size;k++){
v+=a.mat[i][k]*b.mat[k][j];
}
tmp.mat[i][j]=v;
}
}
return tmp;
}
int main(void)
{
int pow;
matrix a;
scanf("%d",&a.size);
for(int i=0;i<a.size;i++){
for(int j=0;j<a.size;j++){
scanf("%d",&a.mat[i][j]);
}
}
matrix ans;
ans.size=a.size;
for(int i=0;i<a.size;i++){
for(int j=0;j<a.size;j++){
if(i==j) ans.mat[i][j]=1;
else ans.mat[i][j]=0;
}
}
scanf("%d",&pow);
while(pow!=0){
if(pow%2==1){
ans=multi(ans,a);
}
pow/=2;
a = multi(a,a);
}
print(ans);
return 0;
}