快速幂前不k--也能过
#include <bits/stdc++.h>
#define mod(a) (a) % modn
using namespace std;
typedef long long ll;
const int modn = 1e9+7;
const int N = 100+5;
struct matrix{
ll ma[N][N];
inline matrix(){
memset(ma, 0, sizeof(ma));
}
};
inline matrix operator*(const matrix& a, const matrix& b){
matrix c;
for (ll i=0; i<N; i++){
for (ll j=0; j<N; j++){
for (ll k=0; k<N; k++){
c.ma[i][j] = mod(mod(c.ma[i][j]) + mod(a.ma[i][k] * b.ma[k][j]));
}
}
}
return c;
}
inline matrix Ein(){
matrix e;
for (ll i=0; i<N; i++){
e.ma[i][i] = 1;
}
return e;
}
inline void printMatrix(matrix ma, ll n){
for (ll i=0; i<n; i++){
for (ll j=0; j<n; j++){
printf("%lld ", ma.ma[i][j]);
}
printf("\n");
}
}
inline matrix fastPower(matrix a, ll k){
matrix m = Ein();
k--;
while(k){
if(k&1) m = m * a;
a = a * a;
k>>= 1;
}
return m;
}
inline matrix getFromInput(ll n){
matrix a;
for (ll i=0; i<n; i++){
for (ll j=0; j<n; j++){
ll e;
scanf("%lld", &e);
a.ma[i][j] = e;
}
}
return a;
}
int main(){
int n, k;
scanf("%d %d", &n, &k);
matrix m = getFromInput(n);
matrix p = fastPower(m, k);
printMatrix(p, n);
return 0;
}
写成
inline matrix fastPower(matrix a, ll k){
matrix m = Ein();
while(k){
if(k&1) m = m * a;
a = a * a;
k>>= 1;
}
return m;
}
也过了