题目大意:给定n阶方阵A,计算S = A^1+A^2+……+A^k
 (mod m)  (k <= 10^9)
 
我们可以根据矩阵快速幂在O(n^3log(k))的时间里算出A^k,但我们也不能一个一个算再加起来啊,那样铁定超时……
 
①二分
这种方法我觉得与
秦九韶算法计算多项式的思路类似,都是找出重复因子而减少多项式计算的次数.当然我们这个多项式比较特殊,所以有比秦九韶算法更好的思路:
当k为偶数时:
S(k) = A^1+A^2+A^3 + A^(k/2) + A^(k/2+1) + …… + A^(k/2+k/2)
= (A^(k/2) + E) (A^1 + A^2 + A^3 …… + A^(k/2) )
=(A^(k/2) + E) * S(k/2)
当k为奇数时:
S(k) = S(k-1) * A^k
 
这种方法可能出现递归过深的问题,所以要设置好占空间小心栈溢出,而且速度也偏慢
| 11217405 | AbandonZHANG | 3233 | Accepted | 3532K | 704MS | G++ | 2444B | 2013-01-28 20:53:36 | 
 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
 
②线性变换(很赞的一种方法呐~!涨姿势~)
我们考虑递推,即从s(k-1)到s(k)的线性变换。
首先一维线性变换显然是出不来的,就像A^1+A^2+A^3+……+A^k = d * (A^1+A^2+A^3+……+A^(k-1)  ) 明显不行……
那么我们再加一维就显然了:
A^1+A^2+A^3+……+A^k =( A^1+A^2+A^3+……+A^(k-1)  ) + A^k
A^(k+1) = 0 * ( A^1+A^2+A^3+……+A^(k-1)  ) + A * A^k.        //这一行的变换是作为辅助,补全二维的线性变换.
那么线性变换矩阵B显然就是:
1 1
0 1
一般化就有
s(k)                    1  1             s(k-1)
A^k+1     =     0  1     *     A^k
即P(k) = B^(n-1) * P(1)
 
这样要比①好多了,又省空间又省时间。
| 11217490 | AbandonZHANG | 3233 | Accepted | 1016K | 282MS | G++ | 2962B | 2013-01-28 21:25:37 | 
 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include