可能溢出的地方都提前取模了,造了点测试案例也没有发现溢出,难道是逻辑错了...
#include <iostream>
#include <cstring>
using namespace std;
#define LL long long
#define MOD(x) ((LL)(x) % (LL)(1e9 + 7))
const int N = 110;
int n, A[N][N];
LL k;
void mul(int a[N][N], int b[N][N]){
int c[N][N] = {0};
for(int i = 0; i < n; ++ i)
for(int j = 0; j < n; ++ j)
for(int k = 0; k < n; ++ k)
c[i][j] = MOD(c[i][j] + 1LL * a[i][k] * b[k][j]);
memcpy(a, c, sizeof c);
}
void mod_exp_fast(int A[N][N], LL exp){
int I[N][N] = {0};
for(int i = 0; i < n; ++ i)
I[i][i] = 1;
exp = MOD(exp);
while(exp){
if(exp & 1 == 1)
mul(I, A);
mul(A, A);
exp >>= 1;
}
memcpy(A, I, sizeof I);
}
int main(){
cin >> n >> k;
for(int i = 0; i < n; ++ i)
for(int j = 0; j < n; ++ j)
cin >> A[i][j];
mod_exp_fast(A, k);
for(int i = 0; i < n; ++ i){
for(int j = 0; j < n; ++ j){
cout << A[i][j] << ' ';
}
cout << endl;
}
return 0;
}