题解 | #矩阵幂#

矩阵幂

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

#include<iostream>
using namespace std;


/*
* 数字快速幂,初始值为1
* 矩阵快速幂,初始值为单位矩阵
*/

struct Matrix {
    int matrix[10][10];
    int col, row;
    Matrix(int r, int c): row(r), col(c) {}
};

void printMat(Matrix& ans) {
    //printf("row:%d;col:%d\n",ans.row,ans.col);
    for (int i = 0; i < ans.col; i++) {
        for (int j = 0; j < ans.row; j++) {
            if (j == ans.row - 1) {
                printf("%d", ans.matrix[i][j]);
            } else {
                printf("%d ", ans.matrix[i][j]);
            }
        }
        printf("\n");
    }
}

Matrix Multiply(Matrix x, Matrix y) {
    Matrix res(x.row, y.col);
    for (int i = 0; i < res.row; i++) {
        for (int j = 0; j < res.col; j++) {
            res.matrix[i][j] = 0;
            for (int k = 0; k < x.col; k++) {
                res.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j];
            }
        }
    }
    return res;
}

void FastExp(Matrix x, int k, Matrix& ans) {
    for (int i = 0; i < ans.row; i++) {
        for (int j = 0; j < ans.col; j++) {
            //调了半天,最后发现是这里写成了i<ans.col
            if (i == j) {
                ans.matrix[i][j] = 1;
            } else {
                ans.matrix[i][j] = 0;
            }
        }
    }
    while (k != 0) {
        if (k % 2 == 1) {
            ans = Multiply(ans, x);
        }
        k /= 2;
        x = Multiply(x, x);
    }
}



int main() {
    int n, k;
    while (scanf("%d %d", &n, &k) != EOF) {
        //int a[n][n],ans[n][n];    //全局数组这样好像不行,内部的居然可以
        Matrix x(n, n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &x.matrix[i][j]);
            }
        }
        Matrix ans(n, n);
        FastExp(x, k, ans);
        printMat(ans);
    }
    return 0;
}
  1. 写循环的时候不要掉以轻心,一些奇怪的错误可能很久都调不出来
  2. 结构体可以直接赋值,也可以写构造函数,也可以引用传参!!还是很好用的~
全部评论

相关推荐

会员标识
昨天 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
02-11 12:20
门头沟学院 Java
面试中的青提很胆小:我不信有比我们学校更逆天的,计算机专业就业第一位是我们学校二餐厅的打印店
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务