链接:link.
题意:给一个n * n的矩阵A,求S=A+A2+A3+…+Ak;
思路:构造
(
E
A
O
A
)
\begin{pmatrix}{E}&{A}\\ {O}&{A}\\\end{pmatrix}
(EOAA) *
(
S
k
−
1
A
k
−
1
)
\begin{pmatrix}{S_{k-1}}\\ {A^{k-1}}\\\end{pmatrix}
(Sk−1Ak−1)=
(
S
k
A
k
)
\begin{pmatrix}{S_{k}}\\ {A^{k}}\\\end{pmatrix}
(SkAk)
二分:A+A2+A3+A4=A2 * (A+A2);
int n,k,mod;
struct node
{
int v[35][35];
}res,init;
node mult(node x,node y)
{
node tmp;
memset(tmp.v,0,sizeof(tmp.v));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
tmp.v[i][j]=(tmp.v[i][j]+x.v[i][k]*y.v[k][j]%mod)%mod;
}
}
}
return tmp;
}
node Pow(node x,int k)
{
node tmp;
memset(tmp.v,0,sizeof(tmp.v));
for(int i=0;i<n;i++)tmp.v[i][i]=1;
while(k)
{
if(k&1)tmp=mult(tmp,x);
x=mult(x,x);
k=k>>1;
}
return tmp;
}
node add(node x,node y)
{
node tmp;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
tmp.v[i][j]=(x.v[i][j]%mod+y.v[i][j]%mod)%mod;
}
}
return tmp;
}
node sum(node x,int k)
{
if(k==1)return x;
node tmp=sum(x,k/2);
if(k&1)
{
node y=Pow(x,k/2+1);
tmp=add(mult(y,tmp),tmp);
return add(tmp,y);
}
else
{
node y=Pow(x,k/2);
return add(mult(y,tmp),tmp);
}
}
int main()
{
cin>>n>>k>>mod;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int x;cin>>x;
init.v[i][j]=x%mod;
}
}
res=sum(init,k);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<res.v[i][j]%mod<<" ";
}
cout<<"\n";
}
return 0;
}