题解:洛谷 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
posted @ 2026-03-14 17:02  团爸讲算法  阅读(0)  评论(0)    收藏  举报