题解 UVA11149 Power of Matrix
简要题意:
给定一个 $n \times n$ 的矩阵 $A$ 和一个数 $k$,求 $\sum_{i = 1}^{k}A^i $。
法一:暴力求解,单次时间复杂度 $O(n^3k)$
法二:分治,单次时间复杂度 $O(n^3log^2k)$
我们可以按照分治的定义照猫画虎,将原式变成这样:
$$A+A^2+A^3+A^4+\ldots+A^K = (A+A^2+A^3+\ldots+A^{\frac{k}{2}})+A^{\frac{k}{2}}(A+A^2+A^3+\ldots+A^{\frac{k}{2}})$$
然后递归处理即可,分治部分的代码大概长这样:
1 | mat solve(mat bas, LL pos) { \\bas是原矩阵,pos代表当前k的大小 |
于是我们惊喜的发现,这种做法又慢又不稳定,所以我们考虑法三。
法三:倍增,单次时间复杂度 $O(n^3logk)$
我们观察要求的这个式子,发现 $i$ 要枚举到 $k$ 非常慢,那么我们就想办法优化这个枚举的过程,也就是对 $i$ 进行倍增,则有:
$$\sum_{i=0}^{log_2k} A^{2^i}(\sum_{j=1}^{2^i} A^j)$$
我们显然不能每次都从头到尾加一遍,所以我们用两个数组 $f$ 和 $s$对这个式子进行递推。
$$f_i=A^{2^i},s_i=\sum_{j=1}^{2^i}A^j$$
不难发现在递推 $f_i$ 时只要每次把 $f_{i-1}$ 平方就可以了,而 $s_i$ 略微复杂一些,求它其实很像刚刚分治的做法,即 $s_i=s_{i-1}+f_{i-1} \times s_{i-1}$。
如果题目高速我们 $k$ 保证是 2 的若干次幂,那么这个题已经做完了,但很遗憾我们没有这个条件,所以还要想办法处理剩余的部分。本过程较为复杂,建议多看几遍。 我们知道整数的一个重要性质就是可以将其拆解为若干 2 的幂之和,假设我们的 $i$ 最后枚举到了 $m$ 使得 $2^m > k$ 且 $2^{m-1} < k$,那么此时我们就想要拆解 $k-2^{m-1}$ 这一部分,那么显然我们最简单的方法是从 $m-1$ 开始向下枚举,设循环变量为 $i$,当枚举到一个 $i$ 使得 $2^{m-1}+2^i<k$ 的时候,就从刚刚处理出来的两个数组中取出第 $i$ 项加到答案里就可以了。这样枚举到 $s^{m-1}+2^i=k$ 时说明我们已经完成对答案的处理,输出答案就可以了。
下面是参考代码(倍增过程在 $\operatorname{solve}$ 函数部分):
1 |
|
ps. 特别提醒,UVa要注意输入和输出格式
说些什么吧!