编辑
2023-10-21
算法题
00
请注意,本文编写于 567 天前,最后修改于 567 天前,其中某些信息可能已经过时。

P3390

cpp
#include <iostream> #include <vector> #include <cstring> const int MOD = 1000000007; // 定义一个矩阵结构 struct Matrix { int n; // 矩阵的维度 std::vector<std::vector<int>> data; // 矩阵数据 Matrix(int _n) : n(_n), data(_n, std::vector<int>(_n, 0)) {} // 创建并返回一个单位矩阵 static Matrix identity(int n) { Matrix mat(n); for (int i = 0; i < n; ++i) { mat.data[i][i] = 1; } return mat; } // 矩阵相乘操作 Matrix operator*(const Matrix& other) const { Matrix result(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { for (int k = 0; k < n; ++k) { // 用模运算防止整数溢出 result.data[i][j] = (result.data[i][j] + 1LL * data[i][k] * other.data[k][j] % MOD) % MOD; } } } return result; } }; // 矩阵的高次幂计算 Matrix matrixPower(Matrix mat, long long k) { int n = mat.n; Matrix result = Matrix::identity(n); while (k) { if (k % 2) { result = result * mat; } mat = mat * mat; k /= 2; } return result; } int main() { int n, k; std::cin >> n >> k; Matrix A(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { std::cin >> A.data[i][j]; } } Matrix result = matrixPower(A, k); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { std::cout << result.data[i][j] << " "; } std::cout << std::endl; } return 0; }

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!