1. 程式人生 > >演算法題目:A為矩陣,求S(n)=A^1+A^2+...+A^n 小技巧

演算法題目:A為矩陣,求S(n)=A^1+A^2+...+A^n 小技巧

解題思路:

第一種方法:

題意為給定矩陣A,以及k, mod ,求 A+A^2+A^3+......A^k    的和對mod取餘。

一開始用迴圈k次,遞推的做法,超時。。。

看了解題報告,求和的時候要用到二分求和。

所求的和用s(k)表示。

當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)   

s(k)=s(k/2)+A^(n/2) * s(k/2) 即s(k)=(E+A^(n/2))*s(n/2)  (E為單位矩陣)

當k為奇數時:

s(k)=s(k-1)+A^k ,  那麼k-1為偶數,可以按照上面的二分

matrix call(matrix A,int k)  
{  
    if(k==1) return A;  
    if(k&1)  
        return addmatrix(call(A,k-1),powmatrix(A,k));//當k為奇數時,減1變為偶數 S(K)=S(K-1)+A^K  
    else  
        return mulmatrix(addmatrix(powematrix(A,0),powmatrix(A,k>>1)),call(A,k>>1));  
        //當K為偶數時,S(K)=(1+A^(K/2))*S(K/2)  
}