水题不解释.
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;
}
京公网安备 11010502036488号