题解 | 矩阵幂
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,k;
while(cin>>n>>k) {
int a[n][n],b[n][n];
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cin>>a[i][j];
b[i][j] = i==j?1:0;
}
}
while(k!=0) {
int tmp[n][n];
if(k%2==1) {
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
tmp[i][j]=0;
for(int k=0; k<n; k++) {
tmp[i][j]+=b[i][k]*a[k][j];
}
}
}
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
b[i][j]=tmp[i][j];
}
}
}
k/=2;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
tmp[i][j]=0;
for(int k=0; k<n; k++) {
tmp[i][j]+=a[i][k]*a[k][j];
}
}
}
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
a[i][j]=tmp[i][j];
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<b[i][j]<<" ";
}
cout<<endl;
}
}
}
这里使用快速幂的逻辑就是每个部分的计算都是乘法,那么同理的可以用快速幂的方式优化乘法的计算,然后对于算子,是矩阵,所以要实现矩阵的乘法,我这里不方便写在外面,直接内部实现了
查看12道真题和解析