题目:给出一个 n×n 的矩阵 A 和一个正整数 k,求 S=A+A2+A3+......+Ak。矩阵中的每个数对 m 取模。
数据范围:1≤n≤30,1≤k≤109,1≤m≤104。每个数不大于 32768。
代码(TLE):
#include<bits/stdc++.h>
using namespace std;
struct matrix{
int c[32][32];
matrix(){memset(c,0,sizeof(c));}
void cch(){for(int i = 0;i<32;i++)c[i][i] = 1;}
}a,aans,t;
int n,m,k;
matrix operator+(matrix x,matrix y){
matrix z;
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
z.c[i][j] = (x.c[i][j]+y.c[i][j])%m;
return z;
}
matrix operator*(matrix x,matrix y){
matrix z;
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
for(int k = 1;k<=n;k++)
z.c[i][j] = (z.c[i][j]+x.c[i][k]*y.c[k][j])%m;
return z;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cout.tie(0);
cin>>n>>k>>m;
for(int i = 1;i<=n;i++)for(int j = 1;j<=n;j++)cin>>a.c[i][j];
t.cch();
for(int i = 1;i<=k;i++){
t = t*a;
aans = aans+t;
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++)cout<<aans.c[i][j]<<' ';
cout<<'\n';
}
return 0;
}