本文参考:
http://www.matrix67.com/blog/archives/276(主要!)
IOI国家集训队2008 俞华程《矩阵乘法在信息学中的应用》(主要!)
因为matrix67大牛的文章出了一些偏差,文章剩余部分在这篇博客里可以找到
https://www.cnblogs.com/frog112111/tag/%E7%9F%A9%E9%98%B5%E7%BB%8F%E5%85%B8%E7%AE%97%E6%B3%95/
https://amoshyc.github.io/ojsolution-build/poj/p3233.html
前置技能树
1.两个N阶矩阵相乘:复杂度为N^3,(能优化到更低,但没必要去掌握)
2.快速幂算法:求数a^t,能在 (log t)的复杂度下,得解
3.矩阵快速幂:把矩阵A^k,跟上一个思路一样,不过基础单元a\*a变成了A\*A,复杂度就是矩阵\*快速幂(N^3\* long k)
4.求余运算:(a+b)%c=(a%c+b%c)%c,形状如此。乘法,次方也行
类型1:根据矩阵快速幂的定义操作
一: 给定矩阵A,请快速计算出A^n(n个A相乘)的结果,输出的每个数都mod p。
这是裸的矩阵快速幂,点亮前置技能树就能搞。
二:給定 NxN 矩陣 A,正整數 K,正整數 M,求 S = A^1 + A^2 + … + A^K。輸出時每個元素要 mod M。
网上有两种思路,
1.采用二分的方式:
首先我们知道,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,即可得到原问题的答案。
2.构造矩阵:(容易理解)