快速矩阵幂

来源:互联网 发布:网络流行文化 编辑:程序博客网 时间:2024/06/16 09:09
/*****************************************************    > File Name: matrix_factorial.cpp    > Author: Yuji CAO    > Mail: 1007171627@qq.com     > Created Time: 六  6/10 13:30:07 2017 *****************************************************/#include<map>#include<vector>#include<unordered_set>#include<unordered_map>#include<list>#include<queue>#include<deque>#include<stack>#include<iostream>#include<set>using namespace std;typedef vector<vector<int> > matrix;class matrix_pow {public:    /**     * 矩阵乘法     **/    static matrix mul(const matrix& left, const matrix& right) {        matrix ret = matrix_pow::mk_zero((int)left.size(), (int)right.size());        for (int i = 0; i < left.size(); ++i) {            for (int j = 0; j < right[0].size(); ++j) {                int tmp = 0;                for (int k = 0; k < left[i].size(); ++k) {                    tmp += left[i][k] * right[k][j];                }                ret[i][j] = tmp;            }        }        return ret;    }    /**     * 构造零矩阵     **/    static matrix mk_zero(int n, int m) {        return vector<vector<int> >(n, vector<int>(m, 0));    }    /**     * 构造单元矩阵     **/    static matrix mk_unit(int n) {        matrix ret = vector<vector<int> >(n, vector<int>(n, 0));        for (int i = 0; i < n; ++i) {            ret[i][i] = 1;        }        return ret;    }    /**     * 快速矩阵幂     **/    matrix pow(matrix& A, int n) {        matrix tmp = A;        matrix ret = matrix_pow::mk_unit((int)A.size());        while (n) {            if (n & 1) {                ret = matrix_pow::mul(ret, tmp); //            }            tmp = matrix_pow::mul(tmp, tmp); //求A^1,A^2,A^4,...,A^n            n = n >> 1;        }        return ret;    }};int main() {    matrix_pow mp;    int s;    cin>>s;    matrix A(s, vector<int>(s, 0));    for (int i = 0; i < s; ++i) {        for (int j = 0; j < s; ++j) {            cin>>A[i][j];        }    }    int n;    cin>>n;    matrix ret = mp.pow(A, n);    for (int i = 0; i < s; ++i) {        for (int j = 0; j < s; ++j) {            cout<<ret[i][j]<<"\t";        }        cout<<endl;    }    return 0;}