構造一個矩陣
發現
所以我們只需要用快速冪計算S的k+1次方,然後將右上方的矩陣減去單位矩陣就是結果。
#include <cstdio>
#include <cstring>
#include <iostream>
#define ms(a,b) memset(a,b,sizeof(a))
#define mc(a,b) memcpy(a,b,sizeof(b))
using namespace std;
const int N=71;
int n,m;
void mul(int a[N][N],int b[N][N])
{
int c[N][N];
ms(c,0);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%m;
mc(a,c);
}
void qpow(int a[N][N],int b)
{
int c[N][N];
ms(c,0);
for(int i=1;i<=n;i++) c[i][i]=1;
while(b)
{
if(b&1) mul(c,a);
b>>=1;
mul(a,a);
}
mc(a,c);
}
int main()
{
int k,a[N][N];
cin>>n>>k>>m;
ms(a,0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) cin>>a[i][j];
a[i][n+i]=a[n+i][n+i]=1;
}
n<<=1;
qpow(a,k+1);
n>>=1;
for(int i=1;i<=n;i++)
{
for(int j=n+1;j<=(n<<1);j++)
{
if(i+n==j) cout<<((a[i][j]-1)%m+m)%m<<" ";
else cout<<(a[i][j]%m+m)%m<<" ";
}
cout<<endl;
}
//system("pause");
}