#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int MAX=50;
int MU;
struct juzhen{
int a[MAX][MAX];
int H;
int L;
};
juzhen jiafa(juzhen x,juzhen y);
juzhen cheng(juzhen x,juzhen y);
juzhen power(juzhen x,int n);
juzhen mi(juzhen x,int n);
int main()
{
int n,k;
int i,j;
juzhen x;
while(scanf("%d%d%d",&n,&k,&MU)!=EOF)
{
x.H=x.L=n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&x.a[i][j]);
x=mi(x,k);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(j==0)
printf("%d",x.a[i][j]);
else
printf(" %d",x.a[i][j]);
printf("\n");
}
}
return 0;
}
juzhen mi(juzhen x,int n)//求a^1+a^2+a^3++a^n
{
if(n==1)
return x;
juzhen y,z,q;
if(n%2) //如果n是奇数,mi(n)=mi(n/2)+a^n/2+1+a^n/2+1*mi(n/2);
{
y=mi(x,n/2);
z=power(x,n/2+1);
q=cheng(y,z);
return jiafa(q,jiafa(z,y));
}
else //如果n是偶数,mi(n)=mi(n/2)+a^n/2*mi(n/2);
{
y=mi(x,n/2);
z=power(x,n/2);
q=cheng(y,z);
return jiafa(q,y);
}
}
juzhen jiafa(juzhen x,juzhen y)
{
int i,j;
juzhen z;
z.H=x.H;
z.L=x.L;
for(i=0;i<z.H;i++)
for(j=0;j<z.L;j++)
{
z.a[i][j]=x.a[i][j]%MU+y.a[i][j]%MU;
z.a[i][j]%=MU;
}
return z;
}
juzhen cheng(juzhen x,juzhen y)
{
juzhen z;
int i,j,k;
z.H=x.H;
z.L=y.L;
for(i=0;i<z.H;i++)
for(j=0;j<z.L;j++)
{
z.a[i][j]=0;
for(k=0;k<x.H;k++)
{
z.a[i][j]+=x.a[i][k]*y.a[k][j];
z.a[i][j]%=MU;
}
}
return z;
}
juzhen power(juzhen x,int n)
{
juzhen y;
y.H=x.H;
y.L=x.L;
int i,j;
for(i=0;i<y.H;i++)
for(j=0;j<y.L;j++)
if(i==j)
y.a[i][j]=1;
else
y.a[i][j]=0;
while(n)
{
if(n%2==1)
{
y=cheng(x,y);
}
x=cheng(x,x);
n/=2;
}
return y;
}
矩阵模板
最新推荐文章于 2023-07-05 10:13:47 发布