大家好,能不能帮我看看我这个矩阵快速幂的问题
#include
using namespace std;
inline int read(){char x=getchar();int ans=0,flag=1;if(x=='-'){
flag=-1;x=getchar();}//标记符号
while(isdigit(x)){ans=ans*10+x-'0';x=getchar();}//读入
return ans*flag;//返回值
}//快读
int mat[109][109],matmul[109][109],temp[109][109],ans[109][109];
//矩阵乘法
void matMultip(int a[][109],int b[][109],int matlen){
memset(temp,0,sizeof(temp));
for(int i=1;i<=matlen;i++){
for(int j=1;j<=matlen;j++){
for(int k=1;k<=matlen;k++){
temp[i][j]+=a[i][k];b[k][j];
}
}
}
for(int i=1;i<=matlen;i++){
for(int j=1;j<=matlen;j++){
matmul[i][j]=temp[i][j];
}
}
}
//矩阵快速幂
void matPower(int a[][109],int matlen,int kk){
memset(ans,0,sizeof(ans));
for(int i=1;i<=matlen;i++){
ans[i][i]=1;
}
while(kk){
if(kk&1){
matMultip(ans,matmul,matlen);
}
else{
matMultip(matmul,matmul,matlen);
}
kk>>=1;
}
}
int main(){
int n=read();//size.mat=n*n,次数=k
for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){mat[i][j]=read();}}//mat读入
int k=read();
matPower(mat,n,k);//矩阵幂(矩阵,大小,次数)
for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cout<
该回答引用ChatGPT
修改如下
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 109;
int mat[MAXN][MAXN], matmul[MAXN][MAXN], temp[MAXN][MAXN], ans[MAXN][MAXN];
// 矩阵乘法
void matMultip(int a[][MAXN], int b[][MAXN], int matlen) {
memset(temp, 0, sizeof(temp));
for (int i = 1; i <= matlen; i++) {
for (int j = 1; j <= matlen; j++) {
for (int k = 1; k <= matlen; k++) {
temp[i][j] += a[i][k] * b[k][j];
}
}
}
for (int i = 1; i <= matlen; i++) {
for (int j = 1; j <= matlen; j++) {
matmul[i][j] = temp[i][j];
}
}
}
// 矩阵快速幂
void matPower(int a[][MAXN], int matlen, int kk) {
memset(ans, 0, sizeof(ans));
for (int i = 1; i <= matlen; i++) {
ans[i][i] = 1;
}
while (kk) {
if (kk & 1) {
matMultip(ans, matmul, matlen);
} else {
matMultip(matmul, matmul, matlen);
}
kk >>= 1;
}
}
int main() {
int n, k;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> mat[i][j];
}
}
cin >> k;
matPower(mat, n, k);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout << matmul[i][j] << " ";
}
cout << endl;
}
return 0;
}