首页 > 其他分享 > Luogu P3390 【模板】矩阵快速幂

Luogu P3390 【模板】矩阵快速幂

时间:2023-06-09 21:14:31浏览次数:44  
标签:le matrix int Luogu 矩阵 times P3390 模板 Matrix

【模板】矩阵快速幂

题目背景

一个 \(m \times n\) 的矩阵是一个由 \(m\) 行 \(n\) 列元素排列成的矩形阵列。即形如

\[A = \begin{bmatrix} a_{1 1} & a_{1 2} & \cdots & a_{1 n} \\ a_{2 1} & a_{2 2} & \cdots & a_{2 n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m 1} & a_{m 2} & \cdots & a_{m n} \end{bmatrix} \text{.} \]

本题中认为矩阵中的元素 \(a_{i j}\) 是整数。

两个大小分别为 \(m \times n\) 和 \(n \times p\) 的矩阵 \(A, B\) 相乘的结果为一个大小为 \(m \times p\) 的矩阵。将结果矩阵记作 \(C\),则

\[c_{i j} = \sum_{k = 1}^{n} a_{i k} b_{k j} \text{,\qquad($1 \le i \le m$, $1 \le j \le p$).} \]

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

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

一个大小为 \(n \times n\) 的矩阵 \(A\) 可以与自身进行乘法,得到的仍是大小为 \(n \times n\) 的矩阵,记作 \(A^2 = A \times A\)。进一步地,还可以递归地定义任意高次方 \(A^k = A \times A^{k - 1}\),或称 \(A^k = \underbrace{A \times A \times \cdots \times A}_{k \text{ 次}}\)。

特殊地,定义 \(A^0\) 为单位矩阵 \(I = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix}\)。

题目描述

给定 \(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\) 取模。

样例 #1

样例输入 #1

2 1
1 1
1 1

样例输出 #1

1 1
1 1

提示

【数据范围】

对于 \(100\%\) 的数据,\(1\le n \le 100\),\(0 \le k \le 10^{12}\),\(|A_{i,j}| \le 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;
}

}

标签:le,matrix,int,Luogu,矩阵,times,P3390,模板,Matrix
From: https://www.cnblogs.com/jueqingfeng/p/17470239.html

相关文章

  • Luogu B2105 矩阵乘法(模板)
    矩阵乘法题目描述计算两个矩阵的乘法。\(n\timesm\)阶的矩阵\(A\)乘以\(m\timesk\)阶的矩阵\(B\)得到的矩阵\(C\)是\(n\timesk\)阶的,且\(C[i][j]=A[i][0]\timesB[0][j]+A[i][1]\timesB[1][j]+\)……\(+A[i][m-1]\timesB[m-1][j](C[i][j]\)表示\(C\)......
  • MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows
    前言由于工作等原因(借口),距离发布上一篇MDT系列的文章已经过去一年::twemoji:sweat::上一章我记录了基于MDT如何使用一个Task即可实现制作Windows基础wim镜像+DIY基础软件+捕捉镜像。传送门有好多同学一直咨询在制作捕捉镜像的时候遇到的常见的2个问题:如何彻底的移除掉Windows10中......
  • golang实现设计模式之模板模式-优缺点,适用场景
    模板模式是一种行为型设计模式,其定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。特点1.算法结构已确定。2.具体实现交由子类实现。结构1.抽象类(AbstractClass)。算法步骤可以被声明为抽......
  • 【web 开发】生活中大家都喜欢搞模板来规范化操作,抽象类却玩不明白-PHP的抽象类
    前言生活中大家都喜欢定标准搞模板来规范化一系列流程,抽象类和接口却玩不明白,抽象类和接口相似,都是一种比较特殊的类,抽象类是一种特殊的类,而接口也是一种特殊的抽象类。他们通常配合面向对象的多态性一起使用。虽然声明和使用都比较容易,但他们的作用在理解上会稍微困难一点,接下来......
  • Treap 模板代码
    structNode{ intpri,data,num,sz,ch[2],fa;}t[maxn];intpos;structTreap{ introot; intnewNode(intx){ t[++pos]=(Node){rand(),x,1,1,0,0,0}; returnpos; } voidupdate(intx){ t[x].sz=t[t[x].ch[0]].sz+t[t[x].ch[1]].sz+......
  • Sgt 模板代码
    structSgt{ intlazyTag; intval;}t[maxn];voidpushUp(intx,intl,intr){ t[x].val=t[x].lazyTag*(r-l+1)+t[x*2].val+t[x*2+1].val;}voidpushDown(intx,intl,intr){ intmid=l+r>>1; t[x*2].lazyTag+=t[x].lazyTa......
  • mysql 8.0.26 my.cnf 配置文件模板
    ##############[mysqld]basedir=/home/work/mysql_3306datadir=/home/work/mysql_3306/datatmpdir=/home/work/mysql_3306/tmppid_file=/home/work/mysql_3306/tmp/mysqld.pidsocket=/home/work/mysql_3306/tmp/mysql.sockmysqlx_socket=/home/work/mysql......
  • Luogu P4219 [BJOI2014]大融合
    [BJOI2014]大融合题目描述小强要在\(N\)个孤立的星球上建立起一套通信系统。这套通信系统就是连接\(N\)个点的一个树。这个树的边是一条一条添加上去的。在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量。例如,在上图中,现在一共有了\(5\)......
  • 21份软件测试全流程文档模板(标准版)
    1、需求说明书2、功能测试计划3、功能测试用例4、业务流程测试用例5、系统安装配置说明书6、阶段功能测试报告7、性能测试计划8、性能测试用例9、性能测试报告10、系统功能测试报告11、需求变更说明书12、用户建议说明书13、验收测试报告14、产品发布说明书15、系统......
  • 模板模式:具体的步骤延迟到子类中实现
    模板模式是一种行为设计模式,它允许将算法的结构与实现分开,从而使得实现可以在不改变算法结构的情况下被重用。模板模式的核心思想是定义一个抽象基类,其中包含了算法的骨架,但是具体的步骤延迟到子类中去实现。这样一来,同一套算法的不同实现可以共享同一个基类代码,从而避免了代码的......