矩阵快速幂

矩阵快速幂

一、例:

斐波那契数列

 

第一个矩阵是转移矩阵记为s,第二个矩阵是当前状态dp[n],等号右边是下一状态记为dp[n+1];

二、当需要递推K次时:

s的K次方*dp[1]=dp[K];

所以s可以利用快速幂的思想来求(注意:快速幂以2为底倍增,事实上你可以用任何大小作为底,只要能更快的求出你想要的结果;详见牛客多校2019-8-1第五场 B)

 

一些简单的递推式:

1.f(n)=a*f(n-1)+b*f(n-2)+c;(a,b,c是常数)

 

2.f(n)=c^n-f(n-1) ;(c是常数)

 

 

三、板子:

  1. struct Mat { ///结构体,矩阵类型
        int m[M][M];
    } res,e;
    void init_e(){
        //整数快速幂默认的ans是1,矩阵的话ans应为单位矩阵
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=n;j++) {
                if(i==j)
                    e.m[i][j]=1;
                else
                    e.m[i][j]=0;
            }
        }
    }
    Mat Mul(Mat a,Mat b,int n) {
        Mat tmp;//定义一个临时的矩阵,存放A*B的结果
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                tmp.m[i][j] = 0;
            }
        }
        for(itn i=1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                for(int k = 1; k <= n; k++) {
                    tmp.m[i][j] += a.m[i][k]*b.m[k][j];
                }
            }
        }
        return tmp;
    }
    ///矩阵快速幂,求矩阵res的N次幂
    Mat Mat_qpower(Mat base,int K){
        res=e;
        while(K) {
            if(K&1)
                res=Mul(res,base);
            base=Mul(base,base);
            K=K>>1;
        }
        return res; 
    }

     

 

posted @ 2019-08-02 19:55  GeraldG  阅读(732)  评论(0编辑  收藏  举报