注意这里的A是一个矩阵 求T的次幂的时候图中是在做分块矩阵的乘法,但是计算机运算时要按照普通矩阵乘法来做,所以要先写出T。
最后求A+A^2+……+A^K是先求出T^(k+1)然后分割成四个分块矩阵,右上角的那个减去单位矩阵就是答案
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
struct matrix{
int a[100][100];
}base, ans;
int n, k, m;
matrix multiply(matrix x, matrix y)
{
matrix tmp;
for (int i = 0; i < 2*n; i++)
for (int j = 0; j < 2*n; j++)
{
tmp.a[i][j] = 0;
for (int k = 0; k < 2*n; k++)
tmp.a[i][j] = (tmp.a[i][j] + x.a[i][k] * y.a[k][j]) % m;
}
return tmp;
}
void fast_mod(int l)
{
while (l)
{
if (l & 1) ans = multiply(ans, base);
base = multiply(base, base);
l >>= 1;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
{
if (ans.a[i][j+n] == 0) ans.a[i][j+n] = m;
printf("%d ", ans.a[i][j+n]-1); // 这里容易出现bug
}
else printf("%d ", ans.a[i][j+n]);
}
printf("\n");
}
}
int main()
{
scanf("%d%d%d", &n, &k, &m);
memset(base.a, 0, sizeof(base.a));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
scanf("%d", &base.a[i][j]);
if (i == j) base.a[i][j+n] = 1;
if (i == j) base.a[i+n][j+n] = 1;
}
memset(ans.a, 0, sizeof(ans.a));
for (int i = 0; i < 2*n; i++)
ans.a[i][i] = 1;
fast_mod(k+1);
return 0;
}
本文探讨了如何高效计算矩阵的高次幂,并应用于实际场景。通过分解矩阵为分块矩阵,利用快速幂技巧实现复杂度优化。
992

被折叠的 条评论
为什么被折叠?



