Luogu P3390 【模板】矩阵快速幂

【模板】矩阵快速幂

题目背景

一个 m×n矩阵是一个由 mn 列元素排列成的矩形阵列。即形如

A=[a11a12a1na21a22a2nam1am2amn].

本题中认为矩阵中的元素 aij 是整数。

两个大小分别为 m×nn×p 的矩阵 A,B 相乘的结果为一个大小为 m×p 的矩阵。将结果矩阵记作 C,则

cij=k=1naikbkj,\qquad(1im1jp).

而如果 A 的列数与 B 的行数不相等,则无法进行乘法。

可以验证,矩阵乘法满足结合律,即 (AB)C=A(BC)

一个大小为 n×n 的矩阵 A 可以与自身进行乘法,得到的仍是大小为 n×n 的矩阵,记作 A2=A×A。进一步地,还可以递归地定义任意高次方 Ak=A×Ak1,或称 Ak=A×A××Ak 次

特殊地,定义 A0 为单位矩阵 I=[100010001]

题目描述

给定 n×n 的矩阵 A,求 Ak

输入格式

第一行两个整数 n,k
接下来 n 行,每行 n 个整数,第 i 行的第 j 的数表示 Ai,j

输出格式

输出 Ak

n 行,每行 n 个数,第 i 行第 j 个数表示 (Ak)i,j,每个元素对 109+7 取模。

样例 #1

样例输入 #1

2 1
1 1
1 1

样例输出 #1

1 1
1 1

提示

【数据范围】

对于 100% 的数据,1n1000k1012|Ai,j|1000

``cpp

include

include

include

include

include

define int long long

const int mod = 1e9 + 7;

using namespace std;

int n, k;

struct Matrix {
int matrix[103][104];
}A;

Matrix Product(Matrix b, Matrix c) {
Matrix a;
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
a.matrix[i][j] = 0;
for (int t = 1; t <= n; ++ t) {
a.matrix[i][j] += b.matrix[i][t] * c.matrix[t][j];
a.matrix[i][j] %= mod;
}
}
}
return a;
}

Matrix MatrixQuickPower(Matrix ask) {
Matrix ans;
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
if (i == j) ans.matrix[i][j] = 1;
else ans.matrix[i][j] = 0;
}
}
Matrix base = ask;
while (k > 0) {
if (k & 1 == 1) {
ans = Product(ans, base);
}
base = Product(base, base);
k >>= 1;
}
return ans;
}

signed main() {
cin >> n >> k;

for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
cin >> A.matrix[i][j];
}
}
A = MatrixQuickPower(A);
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= n; ++ j) {
cout << A.matrix[i][j] << " ";
}
cout << endl;
}

}

posted @   觉清风  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示