矩阵快速幂模板

数据结构
struct Mat{
    ll mat[3][3];
    void init(){
        for (int i = 0; i < 2; ++i){
            for (int j = 0; j < 2; ++j){
                mat[i][j] = ;
            }
        }
        mat[1][1] = 0;
    }
};

  

乘法

Mat operator * (Mat a,Mat b){
    Mat c;
    int i,j,k;
    CL(c.mat,0);
    for (i = 0; i < 2; ++i){
        for (j = 0; j < 2; ++j){
            for (k = 0; k < 2; ++k){
                if (!a.mat[i][k] || !b.mat[k][j]) continue;
                c.mat[i][j] += a.mat[i][k]*b.mat[k][j];
                if (c.mat[i][j] > MOD) c.mat[i][j] %= MOD;
            }
        }
    }
    return c;
}

  

幂:

Mat operator ^ (Mat a,ll k){
    Mat c;
    int i,j;
    //单位矩阵
    for (i = 0; i < 2; ++i){
        for (j = 0; j < 2; ++j){
            c.mat[i][j] = (i == j);
        }
    }
    //求k次幂
    while (k){
        if (k&1) c = c*a;
        k >>= 1;
        a = a*a;
    }
    return c;
}

  

posted @ 2012-09-19 10:42  E_star  阅读(371)  评论(0编辑  收藏  举报