矩阵快速幂总结

快速幂一般都是用来快速递推某个矩阵的n次幂的,一些题目的解法可以通过找规律递推,构建递推矩阵,就可以进行高次计算。

模板自用:

#include <iostream>
#include <vector>
using namespace std;

vector<vector<unsigned long long>> mul(vector<vector<unsigned long long>> a,vector<vector<unsigned long long>> b){
    int n=a.size();
    int s=a[0].size();
    int m=b[0].size();
    vector<vector<unsigned long long>> c(n,vector<unsigned long long>(m,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            for(int k=0;k<s;k++){
                c[i][j]+=a[i][k]*b[k][j];
            }
        }
    }
    return c;
}

vector<vector<unsigned long long>> qmi1(vector<vector<unsigned long long>> a,int k){
    int n=a.size();
    vector<vector<unsigned long long>> res(n,vector<unsigned long long>(n,0));
    for(int i=0;i<n;i++){
        res[i][i]=1;
    }
    while(k){
        if(k&1)res=mul(res,a);
        a=mul(a,a);
        k>>=1;
    }
    return res;
}

unsigned long long qmi2(unsigned long long a,unsigned long long k){
    unsigned long long res=1;
    while(k){
        if(k&1)res=res*1ull*a;
        a=a*1ull*a;
        k>>=1;
    }
    return res;
}

void out(vector<vector<unsigned long long>> a){
    for(int i=0;i<a.size();i++){
        for(int j=0;j<a[0].size();j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
}

记录一次快速幂

posted @ 2020-07-28 13:16  kstranger  阅读(123)  评论(0)    收藏  举报