矩阵快速幂

矩阵快速:由于矩阵乘法具有结合律,因此对于矩阵A,有A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论:当n为偶数时,A^n = A^(n/2) * A^(n/2);当n为奇数时,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。
 

递归:

struct martrix
{
    int m[maxn][maxn];
};
martrix mtmul(martrix a,martrix b)
{
    martrix c;
    int i,j,k;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n;j++)
        {
            c.m[i][j] = 0;
            for(k = 0 ; k < n;k++)
            {
                c.m[i][j] += a.m[i][k] * b.m[k][j];
                c.m[i][j] %=mod;
            }
        }
    }


    return c;
}

 优化的乘法

 1 /*matrix mtmul(matrix a,matrix b)
 2 {
 3     int i,j,k;
 4     matrix c;
 5     c.clear();
 6     for(i =0 ; i <= n;i++)
 7     {
 8         for(k = 0; k <=n;k++)
 9         {
10 
11             if(a.m[i][k])//优化
12             for(j = 0 ; j <=n;j++)
13             {
14                 c.m[i][j] += a.m[i][k]*b.m[k][j];
15 
16             }
17         }
18     }
19     return c;
20 }*/

martrix mtpow(martrix d,int k)
{   martrix a;
    if(k == 1return d;
    int mid = k / 2;
    a = mtpow(d,k/2);
    a = mtmul(a,a);
    if(k & 1)
    {
        a = mtmul(a,d);
    }
    return a;


}

非递归:

 e.m[i][i] = 1 ;

martrix mtpow(martrix d,int k)
{   martrix a;
    a = e;//e 为单位矩阵
   while(k)
   {
       if(k&1)
       {
           a = mtmul(a,d);
       }
       k/=2;
       d = mtmul(d,d);
   }
   return a;

}

                                                                                                                                                                                                           

原文地址:https://www.cnblogs.com/acSzz/p/2647243.html