水题不解释.
https://www.acwing.com/problem/content/99/做法相同不过换成了矩阵.
#include <bits/stdc++.h> using namespace std; const int N=35; int n,m; struct vv{ int a[N][N]; }; vv add(vv nt,vv mt) { vv res; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { res.a[i][j]=(nt.a[i][j]+mt.a[i][j])%m; } } return res; } vv mul(vv nt,vv mt) { vv res; memset(res.a,0,sizeof res.a); for(int i=1;i<=n;i++)//枚举第一个矩阵的行数. { for(int j=1;j<=n;j++)//枚举第二个矩阵的列数. { for(int k=1;k<=n;k++)//平移变量 { res.a[i][j]=(res.a[i][j]+1ll*nt.a[i][k]*mt.a[k][j])%m; } } } return res; } vv qp(vv nt,int t) { vv res; memset(res.a,0,sizeof res.a); for(int i=1;i<=n;i++) res.a[i][i]=1; while(t) { if(t&1) res=mul(res,nt); nt=mul(nt,nt); t>>=1; } return res; } vv sum(vv nt,int k) { if(k==1) return nt; vv res=sum(nt,k/2); if(k&1) return add(add(res,mul(res,qp(nt,k/2))),qp(nt,k)); else return add(res,mul(res,qp(nt,k/2))); } int main() { vv nt; int k; cin>>n>>k>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>nt.a[i][j]; } } vv ans=sum(nt,k); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cout<<ans.a[i][j]<<' '; } cout<<endl; } return 0; }