解题思路
类似于数的快速幂,利用2的幂次,把
A
n
A^n
An转换为
A
2
1
+
2
2
+
2
3
+
.
.
.
+
2
k
A^{2^1+2^2+2^3+...+2^k}
A21+22+23+...+2k
主要分为两个方法,首先实现两个矩阵相乘,然后实现矩阵的快速幂计算。
注意矩阵相乘时的下标,还有初始化结果矩阵为单位矩阵。
#include <algorithm>
#include <array>
#include <cmath>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef long long ll;
typedef vector<vector<ll>> vvl;
typedef vector<ll> vl;
const ll MOD = 1e9+7;
vvl matrix_multiply(vvl& A, vvl&B){
int a = A.size(), b = B.size(), c = B[0].size();
vvl C(a, vl(c, 0));
for(int i = 0; i < a; i++){
for(int j = 0; j < c; j++){
for(int k = 0; k < b; k++){
(C[i][j] += A[i][k]*B[k][j]) %= MOD;
}
}
}
return C;
}
vvl matrix_pow(vvl& A, int n){
int m = A.size();
vvl B(m, vl(m, 0));
for(int i = 0; i < m; i++) {
B[i][i] = 1; //单位矩阵
}
while(n > 0){
if(n&1) B = matrix_multiply(B, A);
A = matrix_multiply(A, A);
n >>= 1;
}
return B;
}
int main(){
int n, x, k;
cin>>n>>k;
vvl A(n,vl(n, 0));
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin>>x;
A[i][j] = x;
}
}
vvl C(n, vl(n, 0));
C = matrix_pow(A, k);
for(int i= 0; i < n; i++){
for(int j = 0; j < n; j++){
if(j != n-1) cout<<C[i][j]<<" ";
else cout<<C[i][j]<<endl;
}
}
}