矩阵乘法是一种高效的算法可以把一些一维递推优化到log
矩阵乘法运算 人工智能

矩阵乘法运算人工智能人工智能在现代科技领域中扮演着重要的角色,其应用范围涵盖了各个领域。
其中,矩阵乘法运算作为人工智能的一个重要技术之一,在人工智能的发展中扮演着重要的角色。
本文将以矩阵乘法运算为主题,探讨其在人工智能中的应用和意义。
一、矩阵乘法的基本概念和原理矩阵乘法是线性代数中的一个基本运算,也是人工智能中常用的计算方法之一。
矩阵乘法的定义是,对于两个矩阵A和B,其乘积C 的第i行第j列元素等于A的第i行向量与B的第j列向量的内积。
矩阵乘法运算可以表示为C = A * B。
矩阵乘法运算在人工智能中的应用十分广泛。
例如,在图像处理中,矩阵乘法可以用来进行图像的特征提取和图像识别。
在自然语言处理中,矩阵乘法可以用来进行词向量表示和语义分析。
在机器学习中,矩阵乘法可以用来进行参数优化和模型训练。
可以说,矩阵乘法运算是人工智能中不可或缺的一部分。
二、矩阵乘法在图像处理中的应用在图像处理中,矩阵乘法可以用来进行图像的特征提取和图像识别。
例如,我们可以将图像表示为一个像素矩阵,然后通过矩阵乘法将图像与特定的滤波器进行卷积运算,从而提取出图像的特征。
通过对提取出的特征进行矩阵乘法运算,可以实现图像的分类和识别。
三、矩阵乘法在自然语言处理中的应用在自然语言处理中,矩阵乘法可以用来进行词向量表示和语义分析。
例如,我们可以将文本表示为一个词矩阵,其中每一行代表一个词的向量表示。
通过矩阵乘法运算,可以将文本中的词向量进行组合和计算,从而得到整个文本的语义表示。
这种语义表示可以用于文本分类、情感分析等任务。
四、矩阵乘法在机器学习中的应用在机器学习中,矩阵乘法可以用来进行参数优化和模型训练。
例如,在神经网络中,通过矩阵乘法运算可以将输入数据与权重矩阵进行相乘,得到隐藏层的输出。
通过反向传播算法,可以通过矩阵乘法来更新神经网络中的权重,从而优化模型的性能。
总结起来,矩阵乘法运算在人工智能中的应用非常广泛,涵盖了图像处理、自然语言处理和机器学习等多个领域。
斐波那契数列快速算法-概述说明以及解释

斐波那契数列快速算法-概述说明以及解释1.引言1.1 概述斐波那契数列作为一个经典的数学问题,一直以来都受到广泛的研究和关注。
它的定义是:每个数都是前两个数的和,即第n个数为第n-1个数与第n-2个数的和。
斐波那契数列的前几个数字是0、1、1、2、3、5、8、13、21、34等。
常规算法是通过递归或循环生成斐波那契数列,但在求解大数列时,这些算法存在效率低下的问题。
因此,我们需要寻找一种更快速的算法来计算斐波那契数列。
本文将详细介绍一个快速算法,该算法可以快速地生成斐波那契数列的任意项,而不需要进行递归或循环。
通过使用矩阵的乘法,我们可以将斐波那契数列的计算转化为矩阵的幂运算。
本文的目的是介绍这种快速算法并分析其优势。
通过对比常规算法和快速算法的运行时间和空间复杂度,我们可以看到快速算法在求解大数列时的优势。
在接下来的章节中,我们会首先介绍斐波那契数列的基本概念和问题背景。
然后,我们将详细讨论常规算法的实现原理和缺点。
接着,会逐步引入快速算法的原理和实现方法,并进行算法效率的对比分析。
最后,在结论部分,我们将对整篇文章进行总结,并重点强调快速算法的优势。
我们希望通过这篇文章的阐述,读者可以更深入地了解斐波那契数列的快速算法,以及在实际应用中的意义和价值。
1.2文章结构文章结构部分的内容可以描述文章的主要内容和组织结构,下面是一个例子:1.2 文章结构本文分为引言、正文和结论三个部分,每个部分都有自己的目标和重点。
下面将对每个部分的内容进行详细介绍。
1. 引言部分旨在引入斐波那契数列快速算法的背景和相关概念。
首先,我们将概述斐波那契数列的定义和特点,以及为什么需要快速算法来计算斐波那契数列。
其次,我们将介绍本文的结构,并列出各个部分的主要内容和目标。
最后,我们明确本文的目的,即通过快速算法探索斐波那契数列的计算方法。
2. 正文部分是本文的核心内容,将详细介绍斐波那契数列以及常规算法和快速算法的原理和实现。
[南开大学]19秋学期(1709至1909)《并行程序设计》在线作业答案1
![[南开大学]19秋学期(1709至1909)《并行程序设计》在线作业答案1](https://img.taocdn.com/s3/m/9820f51b0066f5335b812129.png)
[南开大学]19 秋学期(1709、1803、1809、1903、1909)《并行程序设计》在线作业试卷总分:100 得分:100【题目】两个矩阵相乘,若矩阵总规模小于 cache 大小,则优化访存的最佳方法是____。
A、先将两个矩阵读入 cache 再进行乘法B、先转置第一个矩阵再进行乘法C、先转置第二个矩阵再进行乘法D、以上皆错参考选择是:A【题目】对矩阵乘法串行程序的主体三重循环,我们选择最内层循环进行向量化的原因是____。
A、它最后执行B、外层循环中没有计算操作C、是随意选择的D、它的连续循环步是对不同元素进行相同运算参考选择是:D【题目】MPI 预定义数据类型不包括____。
A、MPI_DOUBLEB、MPI_LONG_LONGC、MPI_BYTED、MPI_PACKED参考选择是:B【题目】推动 GPU 应用于通用高性能计算爆发式增长的开发工具是____。
A、OpenGLB、OpenCLC、DirectXD、CUDA参考选择是:D【题目】pthread_join 通过____指定要等待的线程。
A、pthread_create 返回的线程句柄B、线程的系统 IDC、创建线程时设置的线程号D、创建线程时设置的线程名参考选择是:A【题目】对于加速比 S 和处理器数量 p,下列说法正确的是____。
A、有可能 SpB、必然 SpC、不可能 S=pD、两者无关联参考选择是:A【题目】关于 pthread_create 函数,下列说法错误的是____。
A、它返回是线程创建成功与否的错误码B、线程属性参数使用空指针表示使用默认参数C、它成功创建线程后立刻执行线程函数等待其结束后返回D、可通过它将参数传递给线程函数参考选择是:C【题目】MPI 组通信操作不包括哪类____。
A、通信B、同步C、点对点D、计算参考选择是:C【题目】我国首次获得戈登•贝尔奖是在____年。
A、2015B、2016C、2017D、2018参考选择是:B【题目】n 个节点的线性阵列构造成本为____。
矩阵及矩阵运算

矩阵及矩阵运算矩阵:⼀个m×n的矩阵就是m×n个数排成m⾏n列的⼀个数阵。
由于它把许多数据紧凑的集中到了⼀起,所以有时候可以简便地表⽰⼀些复杂的模型。
在数学中,⼀个矩阵说穿了就是⼀个⼆维数组。
单位矩阵:从左上⾓到右下⾓的对⾓线(称为主对⾓线)上的元素均为1。
除此以外全都为0。
对称矩阵:如果⽅阵满⾜,即,则称A为对称矩阵.它的元素以主对⾓线为对称轴对应相等.矩阵加减法:两个矩阵相加减,即它们相同位置的元素相加减,满⾜交换律和结合律。
只有对于两个⾏数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可⾏的.矩阵乘法:矩阵乘法是⼀种⾼效的算法可以把⼀些⼀维递推优化到log( n ),还可以求路径⽅案等,所以更是⼀种应⽤性极强的算法。
1.矩阵与数的乘法:数乘矩阵A,就是将数乘矩阵A中的每⼀个元素,记为或.特别地,称称为的负矩阵.满⾜结合律和分配律。
2.矩阵与矩阵的乘法:只有当矩阵A的列数与矩阵B的⾏数相等时A×B才有意义。
⼀个m×n的矩阵a(m,n)左乘⼀个n×p的矩阵b(n,p),会得到⼀个m×p的矩阵c(m,p),矩阵乘法满⾜结合率,但不满⾜交换率。
⼀个n⾏m列的矩阵可以乘以⼀个m⾏p列的矩阵,得到的结果是⼀个n ⾏p列的矩阵。
⽅阵A和它同阶的单位阵作乘积,结果仍为A,即.单位阵在矩阵乘法中的作⽤相当于数1在我们普通乘法中的作⽤。
运算规则: 设,,则A与B的乘积是这样⼀个矩阵: (1) ⾏数与(左矩阵)A相同,列数与(右矩阵)B相同,即. (2) C的第⾏第列的元素由A的第⾏元素与B的第列元素对应相乘,再取乘积之和.(3)两个⾮零矩阵的乘积可以是零矩阵.由此若,不能得出或的结论.矩阵转置:将矩阵A的⾏换成同序号的列所得到的新矩阵称为矩阵A的转置矩阵,记作或.第i⾏变第J列。
Aij变成Aji。
运算性质(假设运算都是可⾏的) (1) (2) (3) (4) ,是常数.矩阵⾏列式:基于矩阵所包含的⾏列数据计算得到的⼀个标量;⼆维矩阵[{a,c},{b,d}]的⾏列式等于:det(A) = ab-cd。
浅谈矩阵的应用

浅谈矩阵的应用作者摘要:矩阵是数学的重要研究工具之一,其应用很广泛,矩阵的应用对于矩阵理论以及数学发展有着非常重要的作用。
本论文主要讨论了矩阵在不同领域中的应用,有非常重要的理论及现实意义。
本研究的开展以文献研究法为基础,通过具体实例来将矩阵在不同领域当中的应用问题解决。
主要讨论的矩阵应用领域主要有经济生活、密码学、交通运输、文献管理以及在解方程组、矩阵秩、在计算机中、向量组秩领域。
关键词:矩阵;应用;线性方程组1 引言在汉代《九章算术》当中就已经提出了矩阵的概念,但并非为独立概念,主要是在实际的问题当中进行应用。
至19世纪末,其概念逐渐形成。
到了20世纪开始,矩阵迅速发展,且遍布生活的每个领域当中,随着现代科学的发展,矩阵在经济中广泛而深入的应用是当前经济学最为深刻的因素之一,矩阵的应用是具备重要的现实意义的,在不同领域当中都会有它的身影[1]。
高校中的必须科目就是代数学,而矩阵的应用也是代数学的重要载体之一。
因此,了解且掌握矩阵的应用,对于解决代数学等问题尤为重要。
本文也将对有关矩阵应用的内容进行了解,并通过具体的例子来说明矩阵在经济学、密码学、交通运输、文献管理以及在解方程组、矩阵秩、在计算机中、向量组秩等方面的应用。
2.预备知识由nm 个数a(1,2,..j.=1.2...n)排成的m行n列的数表称为m行n列矩阵,简称m行n矩阵。
只有一行的矩阵A=aa...a)称为行矩阵或行向量,只有一列的矩阵称为列矩阵或列向量。
矩阵计算的合适出发点是矩阵与矩阵的乘法。
这一问题在数学上虽然简单,但从计算_上来看却是十分丰富的。
矩阵相乘可以有好几种不同的形式,还将引入矩阵划分的概念,并将其用来刻画计算上的几种线性代数的“级”。
如果一个矩阵具有某种结构,则它常常可以加以利用。
例如一个对称矩阵,只需要一个一般矩阵的一半空间即可储存。
在矩阵乘向量中如果矩阵有许多零元素,则可减少许多时间。
矩阵计算是基于线性代数运算的,点积运算包括标量的加法和乘法。
优化方法及其工程应用中的斐波那契法

优化方法及其工程应用中的斐波那契法斐波那契法是一种常见的数学算法,被广泛应用于计算机科学和工程领域。
然而,随着问题规模的增大,斐波那契法的效率往往变得低下。
因此,研究人员提出了一系列优化方法来改进斐波那契法,并将其应用于各种工程项目中。
一、优化方法1. 迭代法:传统的斐波那契法使用递归方式计算,但递归会导致大量重复计算,影响效率。
迭代法是一种基于循环的计算方法,通过保存中间结果避免了重复计算,从而提高了效率。
2. 矩阵乘法:斐波那契数列可以通过矩阵乘法的方式来计算。
将斐波那契数列的递推关系转化为矩阵形式,可以利用矩阵乘法的高效性质来加速计算过程。
3. 存储优化:斐波那契法中的关键是保存中间结果,以避免重复计算。
传统的方法使用数组或列表来保存中间结果,但随着问题规模的增大,存储空间的需求也会增加。
因此,研究人员提出了一些存储优化的方法,如使用位操作或只保存最近的几个中间结果。
4. 并行计算:斐波那契法可以通过并行计算的方式来提高效率。
将斐波那契数列的计算任务划分为多个子任务,并行地计算这些子任务,最后将结果合并得到最终的结果。
通过利用多核处理器或分布式计算系统,可以进一步提高计算速度。
二、工程应用1. 金融领域:斐波那契数列在金融领域有广泛应用,如股票价格预测、期权定价等。
优化的斐波那契法可以提高计算效率,减少计算时间,为金融决策提供更快速、准确的支持。
2. 图像处理:斐波那契数列的特性被应用于图像处理领域,如生成斐波那契序列的图案、图像压缩算法等。
通过优化斐波那契法,可以加快图像处理的速度,提高图像处理的效果。
3. 编码算法:斐波那契数列的特性被广泛应用于编码算法中,如霍夫曼编码、动态规划等。
通过优化斐波那契法,可以改进编码算法的性能,提高编码效率。
4. 算法设计:斐波那契法作为一种经典的算法,被广泛应用于算法设计和分析中。
优化的斐波那契法可以提高算法的效率和性能,为解决实际问题提供更好的解决方案。
动态规划算法的常见实例

动态规划算法的常见实例动态规划算法是一种将复杂问题分解为简单子问题来解决的算法,它可被应用于多个领域中,如经济学、生物学、计算机科学等。
在本文中,我们将详细讨论动态规划算法的常见实例。
一、最长公共子序列问题最长公共子序列(LCS)问题是一个经典的计算机科学问题,它要求在两个字符串中找到最长的相同连续子序列。
例如,对于字符串“ABCD”和“ACDF”,最长公共子序列为“ACD”。
使用动态规划方法来解决LCS问题。
首先定义一个m行n列的二维矩阵,其中m和n分别表示两个字符串的长度。
然后,使用以下递推关系:1. 如果一个字符串的长度为0,LCS为0。
2. 如果两个字符不相同,则LCS为它们的前一个字符集合和它们的后一个字符集合的最大值。
3. 如果两个字符相同,则LCS为它们的前一个字符集合和它们的后一个字符集合所组成的子序列中的最大值加1。
最后,矩阵右下角的值就是LCS的长度。
二、背包问题背包问题(Knapsack problem)是一个经典的组合优化问题,被广泛应用于计算机科学和其他领域。
在一个决策者必须决定是否将某些物品放入背包中的场景中,背包问题就发挥了作用。
具体来说,我们要解决的问题是:对于一个固定容量的背包,有一些物品,它们的重量和价值都不同,如何在不超过背包容量的前提下,使所装载物品的总价值最大化。
一种解决方案是使用动态规划方法。
定义一个二维数组,其行表示物品,列表示背包大小。
然后,使用以下递推关系:1. 如果所考虑的物品重量大于背包容量,则不选此物品。
2. 否则,在选取该物品和不选该物品两种情况中选择最优解作为最终结果。
最后,矩阵中右下角的值就是最大的总价值。
三、矩阵链乘法矩阵链乘法是一种计算矩阵乘积的优化算法。
它使用动态规划算法来确定矩阵乘积的最小值。
对于一个长度为n的矩阵链,我们可以定义一个n×n 的矩阵M,其中第i行第j列的元素Mi,j表示第i个矩阵与第j个矩阵相乘的最小次数。
矩阵连乘和strassen矩阵乘法

矩阵连乘和strassen矩阵乘法矩阵连乘问题和 Strassen 矩阵乘法是计算机科学中的两个重要问题。
矩阵常常被用来表示线性算法问题,而矩阵的乘法则是表示两个矩阵之间运算的一种方法。
本文将对这两个问题分别进行介绍,以便更深入地了解矩阵的应用和计算方法。
矩阵连乘问题矩阵连乘问题是指给定一组矩阵,求其乘积的最小计算次数,并构造出相应的计算方法。
在算法中,我们通常采用递归的思想来解决这个问题。
递归过程中,我们根据矩阵的大小将矩阵划分成更小的子矩阵,然后再对这些子矩阵进行计算。
设矩阵连乘的矩阵序列为 A1, A2, A3, ..., An,其中矩阵 Ai 的行数和列数分别为 pi - 1 和 pi。
那么,计算这个矩阵序列的最小计算次数可以表示为递推式:m[i,j] = min{m[i,k] + m[k+1,j] + pi-1 * pk * pj} (i <= k < j)这个式子的意思是将矩阵序列Ai, Ai+1,...,Aj-1, Aj划分为两个子序列Ai, Ai+1,...,Ak和Ak+1,...,Aj,然后在这两个子序列中分别计算矩阵乘积所需的最小计算次数,其中pi-1 * pk * pj表示计算Ai到Aj乘积时需要的乘法次数。
由此,我们可以得出矩阵连乘的递归算法:Matrix Chain Multiply(A, p, i, j)if i == jreturn A[i]elsek = iM = Matrix Chain Multiply(A, p, i, k)N = Matrix Chain Multiply(A, p, k+1, j)return M * N其中,A是矩阵序列,p是矩阵的行列数,i和j表示矩阵序列的起止下标。
在递归过程中,我们用k将矩阵序列划分为两个部分,并分别计算左边和右边的矩阵乘积。
最后将两个部分的计算结果相乘即可。
这种算法的时间复杂度为O(n^3),在处理大规模的矩阵乘积时效率较低。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
矩阵运算是属于线性代数里的一个重要内容,上学期学完后只觉得矩阵能解线性方程,不过高中的时候听说过矩阵能优化常系数递推以及将坐标上的点作线性变换,于是找了些资料研究了一下,并把许多经典题以及HDU shǎ崽大牛总结的矩阵乘法的题目[1]、[2]和开设的矩阵乘法DIY Contest给做完了,感觉收获颇丰。
一个矩阵就是一个二维数组,为了方便声明多个矩阵,我们一般会将矩阵封装一个类或定义一个矩阵的结构体,我采用的是后者:最特殊的矩阵应该就是单位矩阵E了,它的对角线的元素为1,非对角线元素为0。
若A为n×p矩阵,B为p×m矩阵,则它们的乘积AB(有时记做A·B)将是一个n×m矩阵。
其乘积矩阵AB的第i行第j列的元素为:一般矩阵乘法采用朴素的O(n^3)的算法:矩阵加法就是简单地将对应的位置的两个矩阵的元素相加:在ACM的题目中,我们一般考虑的是n阶方阵之间的乘法以及n阶方阵与n维向量(把向量看成n×1的矩阵)的乘法。
矩阵乘法最重要的性质就是满足结合律,同时它另一个很重要的性质就是不满足交换率,这保证了矩阵的幂运算满足快速幂取模(A^k % MOD)算法:假设k = 27,则k的二进制表示为11011,所以按二进制展开,乘以相应的权值,可以看出:k的二进制的每一位矩阵A都要平方,在k二进制为1的位:末矩阵×平方后的A,在k二进制为0的位则末矩阵×E(单位矩阵),即不变。
代码如下:重载按位与(乘方)和加法时注意,加法的优先级高于按位与*->+->^许多题目还要求S = A + A2 + A3+ … + A k.。
其实再作一次二分即可:只需计算log(n)个A 的幂即可。
()()343251A6231=+++++将二分+⨯+AAAeA+AAAAA若A中=m表示从i到j有m条有向边,则kA中=n表示从i经过k条有向边到达j,这样的走法有n种矩阵在ACM 里用处最大的就是加速常系数递推方程的计算,最经典的例子就是Fibonacci 数列,如果普通的递推,计算第n 项复杂度为o(n),显然对于10^9左右的数据就力不从心了。
如果用矩阵快速幂递推的话,计算第n 项的复杂度为o(k 3*log(n)),对应一般的题目已经绰绰有余了,有的题目可以根据矩阵的特殊性进行优化,可以达到o(k 2*log(n))。
由fffn n nba21--+=常系数递推式右边有两项,所以向量和矩阵的规格都为2。
容易如下递推:实现计算Fibonacci 数列第k 项的代码如下:在朴素递推公式中()()()21-+-=n f n f n f 采用线性递推,耗时()n O ,而采用矩阵快速幂时是将n 二进制分解,耗时()()n O log⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫⎝⎛⎪⎩⎪⎨⎧+=+=⎪⎪⎭⎫ ⎝⎛---------ff b a ff ff f ff f f f n n n n n n n n n n nb ab a 1222112112101010()()()()()()()()()()()()⎪⎪⎪⎪⎪⎭⎫⎝⎛⨯⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----⨯⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----12340100100001110143210100010000111013214f f f f n f n f n f n f n f n f n f n f n()2332222122232211222121121212144244442------------------=--+-+=+--+=+-+=+=∑=-=n n n n n n n n n n n n n n n n n n n i n i n n n n a a ta ta S S a a a ta t ta S a a ta ta S a S a S a ta a恰好可以将324---n n a ta 消去,最后有不能由2a去套矩阵凑kA AAA ++++ 321,注意矩阵乘法不满足交换律()13222124824-----+-+=n n n n n S S t StS t S矩阵乘法是一种高效的算法可以把一些一维递推优化到log(n ),还可以求路径方案等,所以更是是一种应用性极强的算法。
矩阵,是线性代数中的基本概念之一。
一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。
由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。
矩阵乘法看起来很奇怪,但实际上非常有用,应用也十分广泛。
基本性质1.结合性(AB)C=A(BC).2.对加法的分配性(A+B)C=AC+BC,C(A+B)=CA+CB .3.对数乘的结合性k(AB)=(kA)B =A(kB).4.关于转置(AB)'=B'A'.制作步骤制作矩阵图一般要遵循以下几个步骤:①列出质量因素:②把成对对因素排列成行和列,表示其对应关系③选择合适的矩阵图类型④在成对因素交点处表示其关系程度,一般凭经验进行定性判断,可分为三种:关系密切、关系较密切、关系一般(或可能有关系),并用不同符号表示⑤根据关系程度确定必须控制的重点因素⑥针对重点因素作对策表。
编辑本段经典题目给定n个点,m个操作,构造O(m+n)的算法输出m个操作后各点的位置。
操作有平移、缩放、翻转和旋转这里的操作是对所有点同时进行的。
其中翻转是以坐标轴为对称轴进行翻转(两种情况),旋转则以原点为中心。
如果对每个点分别进行模拟,那么m个操作总共耗时O(mn)。
利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵,然后每个点与该矩阵相乘即可直接得出最终该点的位置,总共耗时O(m+n)。
假设初始时某个点的坐标为x和y,下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。
预先把所有m个操作所对应的矩阵全部乘起来,再乘以(x,y,1),即可一步得出最终点的位置。
给定矩阵A,请快速计算出A^n(n个A相乘)的结果,输出的每个数都mod p。
由于矩阵乘法具有结合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。
我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。
这就告诉我们,计算A^n也可以使用二分快速求幂的方法。
例如,为了算出A^25的值,我们只需要递归地计算出A^12、A^6、A^3的值即可。
根据这里的一些结果,我们可以在计算过程中不断取模,避免高精度运算。
POJ3233题目大意:给定矩阵A,求A + A^2 + A^3 + ... + A^k的结果(两个矩阵相加就是对应位置分别相加)。
输出的数据mod m。
k<=10^9。
这道题两次二分,相当经典。
首先我们知道,A^i可以二分求出。
然后我们需要对整个题目的数据规模k进行二分。
比如,当k=6时,有:A + A^2 + A^3 + A^4 + A^5 + A^6 =(A + A^2 + A^3) + A^3*(A + A^2 + A^3)应用这个式子后,规模k减小了一半。
我们二分求出A^3后再递归地计算A + A^2 + A^3,即可得到原问题的答案。
VOJ1049题目大意:顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列。
m<=10, k<2^31。
首先将这m个置换“合并”起来(算出这m个置换的乘积),然后接下来我们需要执行这个置换k/m次(取整,若有余数则剩下几步模拟即可)。
注意任意一个置换都可以表示成矩阵的形式。
例如,将1 2 3 4置换为3 1 2 4,相当于下面的矩阵乘法:置换k/m次就相当于在前面乘以k/m个这样的矩阵。
我们可以二分计算出该矩阵的k/m次方,再乘以初始序列即可。
做出来了别忙着高兴,得意之时就是你灭亡之日,别忘了最后可能还有几个置换需要模拟。
《算法艺术与信息学竞赛》207页(2.1代数方法和模型,[例题5]细菌,版次不同可能页码有偏差)大家自己去看看吧,书上讲得很详细。
解题方法和上一题类似,都是用矩阵来表示操作,然后二分求最终状态。
给定n和p,求第n个Fibonacci数mod p的值,n不超过2^31根据前面的一些思路,现在我们需要构造一个2 x 2的矩阵,使得它乘以(a,b)得到的结果是(b,a+b)。
每多乘一次这个矩阵,这两个数就会多迭代一次。
那么,我们把这个2 x 2的矩阵自乘n次,再乘以(0,1)就可以得到第n个Fibonacci数了。
不用多想,这个2 x 2的矩阵很容易构造出来:VOJ1067我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0。
例如,我们可以用下面的矩阵乘法来二分计算f(n) = 4f(n-1) - 3f(n-2) + 2f(n-4)的第k项:利用矩阵乘法求解线性递推关系的题目我能编出一卡车来。
这里给出的例题是系数全为1的情况。
给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。
令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。
类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数。
同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可。
经典题目9用1 x 2的多米诺骨牌填满M x N的矩形有多少种方案,M<=5,N<2^31,输出答案mod p的结果我们以M=3为例进行讲解。
假设我们把这个矩形横着放在电脑屏幕上,从右往左一列一列地进行填充。
其中前n-2列已经填满了,第n-1列参差不齐。
现在我们要做的事情是把第n-1列也填满,将状态转移到第n列上去。
由于第n-1列的状态不一样(有8种不同的状态),因此我们需要分情况进行讨论。
在图中,我把转移前8种不同的状态放在左边,转移后8种不同的状态放在右边,左边的某种状态可以转移到右边的某种状态就在它们之间连一根线。
注意为了保证方案不重复,状态转移时我们不允许在第n-1列竖着放一个多米诺骨牌(例如左边第2种状态不能转移到右边第4种状态),否则这将与另一种转移前的状态重复。
把这8种状态的转移关系画成一个有向图,那么问题就变成了这样:从状态111出发,恰好经过n 步回到这个状态有多少种方案。