题解:洛谷 P3390 【模板】矩阵快速幂
【题目来源】
洛谷:P3390 【模板】矩阵快速幂 - 洛谷 (luogu.com.cn)
【题目描述】
给定 \(n\times n\) 的矩阵 \(A\),求 \(A^k\)。
【输入】
第一行两个整数 \(n,k\)。
接下来 \(n\) 行,每行 \(n\) 个整数,第 \(i\) 行的第 \(j\) 的数表示 \(A_{i,j}\)。
【输出】
输出 \(A^k\)
共 \(n\) 行,每行 \(n\) 个数,第 \(i\) 行第 \(j\) 个数表示 \((A^k)_{i,j}\),每个元素对 \(10^9+7\) 取模。
【输入样例】
2 1
1 1
1 1
【输出样例】
1 1
1 1
【算法标签】
《洛谷 P3390 矩阵快速幂》 #数学# #矩阵乘法# #模板题# #O2优化#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 105, mod = 1e9 + 7;
int n, k; // n: 矩阵大小,k: 矩阵的幂次
// 矩阵结构体
struct matrix
{
int c[N][N]; // 矩阵数据
matrix() // 构造函数,初始化为0矩阵
{
memset(c, 0, sizeof(c));
}
};
// 矩阵乘法运算符重载
matrix operator*(matrix &x, matrix &y)
{
matrix t; // 结果矩阵
for (int i = 0; i < n; i++) // 行
{
for (int j = 0; j < n; j++) // 列
{
for (int k = 0; k < n; k++) // 中间维度
{
// 矩阵乘法:t[i][j] = Σ(x[i][k] * y[k][j])
t.c[i][j] = (t.c[i][j] + x.c[i][k] * y.c[k][j]) % mod;
}
}
}
return t;
}
// 矩阵快速幂
matrix qmi(matrix a, int k)
{
matrix res; // 单位矩阵
for (int i = 0; i < n; i++)
{
res.c[i][i] = 1; // 主对角线为1
}
while (k)
{
if (k & 1) // 如果当前二进制位为1
{
res = res * a; // 乘以当前矩阵
}
a = a * a; // 矩阵平方
k >>= 1; // 右移一位
}
return res;
}
signed main()
{
cin >> n >> k; // 读入矩阵大小和幂次
matrix M; // 原始矩阵
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int x;
cin >> x; // 读入矩阵元素
M.c[i][j] = x; // 存入矩阵
}
}
matrix Mn = qmi(M, k); // 计算矩阵M的k次幂
// 输出结果矩阵
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << Mn.c[i][j] << " ";
}
cout << endl;
}
return 0;
}
【运行结果】
2 1
1 1
1 1
1 1
1 1
浙公网安备 33010602011771号