矩阵快速幂(模板)

适用于 row 和 col 相同的矩阵

没有 0 优化

#define mod 1000000007
#define MN 5
struct matrix
{ 
    long long ma[MN][MN]; // row 和 col 相同 
    matrix(bool f)
    {
        memset( ma, 0x0000, sizeof(ma) );
        if(f)  // 单位矩阵 
        {
            for(int i = 1; i < MN; i++)
            {
                ma[i][i] = 1;
            }
        }
    }
};
matrix matrix_mul(matrix a,  matrix b) //不用 0 优化 
{
     matrix mp =  matrix(false);
     for(int i = 1; i < MN; i++)
     {
         for(int j = 1; j < MN; j++)
         {
             for(int k = 1; k < MN; k++)
             {
                 mp.ma[i][j] += (a.ma[i][k] * b.ma[k][j] + mod) % mod; // +mod 为防止有负数 
                 mp.ma[i][j] %= mod;
             }
         }
     } 
     return mp;
}
matrix matrix_pow(matrix a, long long x)
{
    matrix mp = matrix( true );
    while( x )
    {
        if( x & 1 )
        {
            mp = matrix_mul(mp, a);
        }
        x >>= 1;
        a = matrix_mul(a, a);
    } 
    return mp;
}

 

posted @ 2017-09-02 17:32  黑.白  阅读(143)  评论(0编辑  收藏  举报