水题不解释.
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;
}