给出n,k,m;n为矩阵A的行数和列数。然后输入矩阵A
求A^1+A^2+...A^k 全部mod m的矩阵。
#include<cstdio>
int n,mod, k;
struct Matrix
{
int m[32][32];
}E, Z;
Matrix Mut(Matrix A, Matrix B)
{
Matrix ans;
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
{
ans.m[i][j] = 0;
for (int k = 0; k<n; k++)
{
ans.m[i][j] += ((A.m[i][k])*(B.m[k][j]));
ans.m[i][j] %= mod;
}
}
return ans;
}
Matrix Add(Matrix A, Matrix B)
{
Matrix ans;
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
ans.m[i][j] = (A.m[i][j] + B.m[i][j]) % mod;
return ans;
}
Matrix Pow(Matrix A, int b)
{
Matrix t = A, ans = E;
while (b)
{
if (b % 2) ans = Mut(ans, t);
b /= 2;
t = Mut(t, t);
}
return ans;
}
Matrix solve(Matrix A, int b)
{
if (b == 0) return E;
else if (b == 1) return A;
else if (b == 2) return Add(A, Mut(A, A));
else if (b % 2 == 1) return Add(Pow(A, b), solve(A, b - 1));
else if (b % 2 == 0)
{
Matrix ans = solve(A, b / 2);
Matrix C = Pow(A, b / 2);
Matrix B = Mut(ans, C);
return Add(B, ans);
}
}
int main()
{
// freopen("in.txt", "r", stdin);
Matrix A;
while(scanf("%d %d %d",&n,&k,&mod)!=EOF)
{
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
E.m[i][j] = (i == j);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&A.m[i][j]);
Matrix ans = solve(A, k);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d",ans.m[i][j]);
if(j==n-1)
printf("\n");
else
printf(" ");
}
}
}
return 0;
}