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; }