题目链接:https://www.luogu.org/problemnew/show/P3390
首先要明白矩阵乘法是什么
对于矩阵A m*p 与 B p*n 的矩阵 得到C m*n 的矩阵
矩阵乘法满足结合律,但不满足交换律(所以可以套快速幂的板子)
进行矩阵乘法时要么重载*号,或者是写一个矩阵相乘的函数
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 struct Matrix{ 7 long long m[110][110]; 8 }A,E; 9 long long n,k,mod = 1000000007; 10 Matrix mul(Matrix A,Matrix B) 11 { 12 Matrix C; 13 for(long long i = 0; i < n; i++) 14 for(long long j = 0; j < n; j++) 15 { 16 C.m[i][j] = 0; 17 for(long long k = 0; k < n; k++) 18 C.m[i][j] = (C.m[i][j]+(A.m[i][k]*B.m[k][j])%mod)%mod; 19 } 20 return C; 21 } 22 Matrix fast(Matrix A, long long k) 23 { 24 Matrix S = E; 25 while(k) 26 { 27 if(k&1) S = mul(S,A); 28 A = mul(A,A); 29 k = k>>1; 30 } 31 return S; 32 } 33 int main(){ 34 35 scanf("%lld%lld",&n,&k); 36 for(long long i = 0; i < n; i++) 37 for(long long j = 0; j < n; j++) 38 scanf("%lld",&A.m[i][j]); 39 40 for(long long i = 0; i < n; i++) E.m[i][i] = 1; 41 Matrix ans = fast(A,k); 42 for(long long i = 0; i < n; i++) 43 { 44 for(long long j = 0; j < n-1; j++) 45 printf("%lld ",(ans.m[i][j])%mod); 46 printf("%lld ",(ans.m[i][n-1])%mod); 47 } 48 return 0; 49 }