1//整数的快速幂 m^n % k 的快速幂:
long long quickpow(long long m , long long n , long long k){
long long ans = 1;
while(n){
if(n&1)//如果n是奇数
ans = (ans * m) % k;
n = n >> 1;//位运算“右移1类似除2”
m = (m * m) % k;
}
return ans;
}
矩阵快速幂
struct Matrix{
int n;
int mat[MAXN][MAXN];
Matrix operator*(const Matrix& matrix)const{
Matrix tmp;
tmp.n = n;
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
tmp.mat[i][j] = 0;
for(int k = 0 ; k < n ; k++)
tmp.mat[i][j] += (mat[i][k]*matrix.mat[k][j]);
}
}
return tmp;
}
};
Matrix quickPow(Matrix& matrix , int k){
Matrix ans;
ans.n = matrix.n;
for(int i = 0 ; i < ans.n ; i++){
for(int j = 0 ; j < ans.n ; j++){
if(i == j)
ans.mat[i][j] = 1;
else
ans.mat[i][j] = 0;
}
}
while(k){
if(k&1)
ans = ans*matrix;
k >>= 1;
matrix = matrix*matrix;
}
return ans;
}
int main(){
Matrix matrix;
int cas , k;
scanf("%d" , &cas);
while(cas--){
scanf("%d%d" , &matrix.n , &k);
for(int i = 0 ; i < matrix.n ; i++)
for(int j = 0 ; j < matrix.n ; j++)
scanf("%d" , &matrix.mat[i][j]);
matrix = quickPow(matrix , k);
}
return 0;
}