题意:求矩阵幂的和
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define maxN 35
struct node{
int ke[maxN][maxN];
}l;
node a,su,unit;
int n,m;
void print(node s)
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("%d ",s.ke[i][j]%m);
printf("\n");
}
}
node add(node b,node c)
{
node d;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d.ke[i][j]=(b.ke[i][j]+c.ke[i][j])%m;
return d;
}
node mul(node b,node c)
{
node temp;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
temp.ke[i][j]=0;
for(int h=0;h<n;h++)
temp.ke[i][j]+=b.ke[i][h]*c.ke[h][j];
temp.ke[i][j]%=m;
}
return temp;
}
node ceil(int k)
{
node p=a,q=unit;
while(k!=1){
if(k&1){
k--;
q=mul(q,p);
}else{
k=k/2;
p=mul(p,p);
}
}
p=mul(p,q);
return p;
}
node get_sum(int k)
{
if(k==1)return a;
node temp,tsu;
temp=get_sum(k/2);
if(k%2){
tsu=ceil(k/2+1);
temp=add(temp,mul(temp,tsu));
temp=add(tsu,temp);
}else{
tsu=ceil(k/2);
temp=add(temp,mul(temp,tsu));
}
return temp;
}
int main()
{
int k;
while(~scanf("%d%d%d",&n,&k,&m))
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
scanf("%d",&a.ke[i][j]);
a.ke[i][j]%=m;
unit.ke[i][j]=(i==j);
}
print(get_sum(k));
}
}