博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[置顶] 矩阵快速幂专题【陆续更新中】
阅读量:5078 次
发布时间:2019-06-12

本文共 3003 字,大约阅读时间需要 10 分钟。

第一题 hdu 1757 A Simple Math Problem

 

思路:矩阵快速幂

分析:

1 最简单的矩阵快速幂的题目,直接利用矩阵求解即可

第二题 hdu 1575 Tr A

 

思路: 矩阵快速幂

分析:

1 题目给定一个n*n的矩阵要求矩阵的k次幂之后的矩阵的对角线的和

2 矩阵快速幂的裸题

第三题 hdu 2604 Queuing

 

思路: 递推+矩阵快速幂

分析;

1 根据题目的意思,我们可以求出F[0] = 0 , F[1] = 2 , F[2] = 4 , F[3] = 6 , F[4] = 9 , F[5] = 15

2 那么根据上面前5项我们可以求出n >= 5的时候 F[n] = F[n-1]+F[n-3]+F[n-4]

    那么我们就可以构造出矩阵

    | 1 0 1 1 |     | F[n-1] |    | F[n] |

    | 1 0 0 0 |  *  | F[n-2] | = | F[n-1] |

    | 0 1 0 0 |     | F[n-3] |    | F[n-2] |

    | 0 0 1 0 |     | F[n-4] |    | F[n-3] |

第四题 hdu 2256 Problem of Precision

 

思路: 矩阵快速幂

分析:

1 题目要求的是(sqrt(2)+sqrt(3))^2n %1024向下取整的值

 

 

3 这里很多人会直接认为结果等于(an+bn*sqrt(6))%1024,但是这种结果是错的,因为这边涉及到了double,必然会有误差,所以根double有关的取模都是错误的思路

第五题 codeforces 185A Plant

 

思路: 递推+矩阵快速幂

分析:

1 题目要求找到在n年后向上三角形的个数

2 写出前面的几个数F(0) = 1 , F(1) = 3 , F(2) = 10 , F(3) = 36 , F(4) = 136

   通过前面几项我们可以找到通项公式F[n] = 4*F[n-1]-2^(n-1)

     那么我们通过够找矩阵

   | 4 -1 |  *  | F(n-1) | = | F(n) |

   | 0 2 |      | 2^(n-1) |   | 2^n |

3 那么够造出矩阵之后我们直接利用矩阵快速幂,由于矩阵开始有负数,所以应该在取模的时候注意一下

第六题 hdu 2842 Chinese Rings

 

思路: 矩阵快速幂

分析:

1 题目的意思是给定n个环,和一些规则要把所有的环全部拆下最少需要的步数

2 题目规定如果要拆第n个环,那么第n-1个要挂着,n-2环要被拆下。那么我们设f(n)表示拆下前n个环的最少的步骤

   那么考虑第n个环的情况,第n-1个环必须要挂着,n-2环要拆下,那么这一步就要f(n-2),拆下第n个需要1步。然后只剩下第n-1个环,由于n-1环需要第n-2环挂着,所以我们需要把前n-2个环挂上去,所以需要f(n-2),剩下n-1个需要拆下需要f(n-1)。那么总的需要f(n) = f(n-2)+1+f(n-2)+f(n-1) => f(n) = 2*f(n)+f(n-1)+1

3 接下来利用矩阵快速幂即可

第七题 hdu 2276 Kiki & Little Kiki 2

 

思路: 矩阵快速幂

分析:

1 题目给定一个01字符串然后进行m次的变换,变换的规则是:如果当前位置i的左边是1(题目说了是个圆,下标为0的左边是n-1),那么i就要改变状态0->1 , 1->0

   比如当前的状态为100101那么一秒过后的状态为010111

2 假设0/1串的长度为n,保存在a数组,下标从0开始

   根据上面的规则我们发现可以得出一秒过后的状态即为a[i] = (a[i]+a[i-1])%2 , 对于a[0] = (a[0]+a[n-1])%2

   那么我们就可以就能够找到递推的式子

   1 1 0 0....     a0        a1

   0 1 1 0...  *  a1   =   a2

   ..........1 1     .....      .....

   1 0 0.....1     an-1    a0

3 但是我们最后要求的是a0 a1 .... an-1 , 所以我们应该把矩阵的第一行和最和一行调换一下,然后进行m次的快速幂即可

4 由于最后的结果是mod2的结果,因此我们可以把所有的*和+运算全部改成&和^

第八题 hdu 2254 奥运

 

 

思路: 矩阵乘法

分析:

1 题目给定一个有向图,要求t1-t2天内v1-v2的路径的个数

2 假设有向图的邻接矩阵为A,那么A表示的是有向图中走一步能够到达哪些点的方案数,那么A^n表示的是走n步能够到达哪些点的方案数

3 根据离散数学里面的可达矩阵的性质,我们知道一个有向图的邻接矩阵的前n次幂的和即为可达矩阵,那么要求[t1-t2]之内的路径的条数,因为题目说了t1 = 0的时候为0。那么假设邻接矩阵为A,那么要求的就是A^(t1-1)+A^(t1)+...+A^(t2-1),为什么是从t1-1开始呢,因为邻接矩阵本身代表走一步的结果

3 还有点的范围很大,边数很少,所以我们应该要进行离散化

4 但是数据量很大,对于具体的一组我们应该要事先求出具体的每一个矩阵,然后直接使用即可

 

第九题 hdu 3117 Fibonacci Numbers

 

思路: 矩阵快速幂

分析:

1 题目要求的是求F(n)中如果位数的个数大于8那么要输出前4四位和后四位,没有到8位的时候直接输出

2 根据题目的样例我们可以知道当n = 40的时候就超过8位了,所以我们可以知道n <= 39的时候直接去求F(n),超过40的时候我们就要去求前4位和后四位

3 我们利用矩阵快速幂可以很快的求出后四位,但是前面四位就很困难了

   下面看一下网上的解法

第十题 hdu 4686 Arc of Dream

 

思路: 矩阵快速幂

分析:

1 题目给定一个式子求和,那么根据题目给定的,我们可以求出an*bn = (an-1*Ax+Ay)*(bn-1*Bx+By) => an-1*bn-1*Ax*Bx+an-1*Ax*By+bn-1*Ay*Bx+Ay*By

2 那么我们根据上面的等式可以推出矩阵的乘法

  

3 那么我们要求的是AoD(n)相当于求左边矩阵的n次幂,然后利用结果乘上初始值

4 注意特判n为0的时候,结果为0。然后注意初始的值

第十一题 zoj 3690 Choosing number

 

思路: 递推+矩阵快速幂

分析;

1 题目的意思是有n个人和m个数和一个k,现在每个人可以选择一个数,但是要求如果相邻的两个人选择相同的数,那么这个数要大于k

2 假设F(n)表示前n个人第n个人选择的数大于k的个数,G(n)表示的是前n个人第n个人选择的数小于等于k的个数

   那么F(n) = F(n-1)*(m-k)+G(n-1)*(m-k) , G(n) = F(n-1)*k+G(n-1)*(k-1) , 那么最后的结果就是F(n)+G(n);

   那么我们可以构造出矩阵

   | m-k m-k|   | F(n-1) |       | F(n) |

   | k      k-1| * | G(n-1) | => | G(n) | 

   那么初始值F(1) = m-k , G(1) = k

 

转载于:https://www.cnblogs.com/pangblog/p/3283434.html

你可能感兴趣的文章
Linux下查看软件的安装路径
查看>>
js总结:三级联动
查看>>
让一个元素相对于父元素固定定位
查看>>
ACM警示
查看>>
自动化构建工具 grunt & gulp
查看>>
PHP和Javascript里诡异的0和空
查看>>
50深入理解C指针之---指针与别名
查看>>
spark总结
查看>>
v3 Creating Custom Field Types收藏
查看>>
Opengles2.0入门
查看>>
linux下对qt编写的程序进行部署
查看>>
Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
查看>>
图像的上采样 下采样
查看>>
iPhone手机相关知识
查看>>
bzoj 2049: [Sdoi2008]Cave 洞穴勘测
查看>>
tp3.2 页面Windows正常 linux异常,页面找不到
查看>>
angularJS(2)
查看>>
centos安装——usb安装技术问题整理
查看>>
C#二维码与条形码的生成
查看>>
【leetcode】Container With Most Water
查看>>