题解 | #矩阵幂#

矩阵幂

https://www.nowcoder.com/practice/31e539ab08f949a8bece2a7503e9319a

#include <iostream>
#include <vector>
using namespace std;
vector<vector<int> > multiMatrix(const vector<vector<int>>& a,
                                 const vector<vector<int>>& b) {
    //a是n*m的,b是m*t的,结果是n*t的
    int n = a.size(), m = a[0].size(),
        t = b[0].size();
    vector<vector<int>> res(n, vector<int>(t, 0));
    for (int i = 0; i < n; i++)//结果的行
        for (int j = 0; j < t; j++)//结果的列
            for (int k = 0; k < m; k++) {//a的列
                res[i][j] += (a[i][k] * b[k][j]);
            }
    return res;
}
vector<vector<int>> powMatrix(const vector<vector<int>>& a, int k) {
    int n = a.size();
    vector<vector<int>> res(n, vector<int>(n, 0));
    // 初始化为单位矩阵
    for (int i = 0; i < n; i++) {
        res[i][i] = 1;
    }
  
    vector<vector<int>> base = a;
    while (k > 0) {
        if (k % 2 == 1) {
            res = multiMatrix(res, base);
        }
        base = multiMatrix(base, base);
        k /= 2;//去掉最后一位
    }
    return res;
}

int main() {
    int n, k;
    while (cin >> n >> k) {
        vector<vector<int>> a(n, vector<int>(n, 0));
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                cin >> a[i][j];
        vector<vector<int>> res = powMatrix(a, k);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) {
                if (j == n - 1)
                    cout << res[i][j] << endl;
                else
                    cout << res[i][j] << " ";
            }
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务