Matrix Power Series
题目链接:Matrix Power Series
解题思路
首先
k
<
=
1
0
18
k<=10^{18}
k<=1018,那么直接算肯定是不行的。
所以我们考虑快速幂和矩阵乘法来计算这道题。
设
∣
a
n
−
1
s
n
−
2
∣
\begin{vmatrix}a^{n-1}&s_{n-2}\end{vmatrix}
∣∣an−1sn−2∣∣
需转移为
∣
a
n
s
n
−
1
∣
\begin{vmatrix}a^{n}&s_{n-1}\end{vmatrix}
∣∣ansn−1∣∣
可得转移矩阵:
∣
a
1
0
1
∣
\begin{vmatrix}a&1\\0&1\end{vmatrix}
∣∣∣∣a011∣∣∣∣
其中
1
1
1 为单位矩阵,即对角线上全是
1
1
1 的矩阵。
code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,mod;
int a[40][40];
int f[200][200];
int t[200][200];
int ans[200][200];
void add()
{
memset(t,0,sizeof(t));
for(int i=1;i<=n*2;i++)
for(int j=1;j<=n*2;j++)
for(int k=1;k<=n*2;k++)
t[i][j]=(t[i][j]+ans[i][k]*f[k][j]%mod)%mod;
for(int i=1;i<=n*2;i++)
for(int j=1;j<=n*2;j++)
ans[i][j]=t[i][j];
}
void cf()
{
memset(t,0,sizeof(t));
for(int i=1;i<=n*2;i++)
for(int j=1;j<=n*2;j++)
for(int k=1;k<=n*2;k++)
t[i][j]=(t[i][j]+f[i][k]*f[k][j]%mod)%mod;
for(int i=1;i<=n*2;i++)
for(int j=1;j<=n*2;j++)
f[i][j]=t[i][j];
}
void kkk()
{
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++)
for(int j=1;j<=n*2;j++)
for(int k=1;k<=n*2;k++)
t[i][j]=(t[i][j]+ans[i][k]*a[k][j]%mod)%mod;
}
void ksm(int b)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans[i][j]=a[i][j];
while(b)
{
if(b&1)
add();
cf();
b>>=1;
}
}
int main()
{
cin>>n>>k>>mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=a[i][j];
for(int i=1;i<=n;i++)
f[i][n+i]=f[n+i][n+i]=1;
ksm(k);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<ans[i][j+n]<<" ";
cout<<endl;
}
}