题解 | #矩阵幂#

矩阵幂

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


import java.util.Arrays;
import java.util.Scanner;

class Matrix {
    public static void mutl(int[][] matrix1, int[][] matrix2) {
        int len = matrix1.length;
        int[][] temp = new int[len][len];
        int[][] temp2 = new int[len][len];
        for (int i = 0; i < len; i++) {
            System.arraycopy(matrix1[i], 0, temp[i], 0, len);
            System.arraycopy(matrix2[i], 0, temp2[i], 0, len);
        }

        int g = 0;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                int sum = 0;
                for (int k = 0; k < len; k++) {
                    sum += temp[i][k] * temp2[k][j];
                }
                matrix1[g / len][g % len] = sum;
                g++;
            }
        }
    }

    public static void add(int[][] m1, int [][]m2) {
        for (int i = 0; i < m1.length; i++) {
            for (int j = 0; j < m1[0].length; j++) {
                m1[i][j] += m2[i][j];
            }
        }
    }

    public static int[][] getE(int n) {
        int[][] ans = new int[n][n];
        for (int i = 0; i < n; i++) {
            ans[i][i] = 1;
        }
        return ans;
    }

    public static int[][] powK(int[][] matrix, int k) {
        int len = matrix.length;
        int [][] ans = getE(len);
        int [][] g = new int[len][len];
        for (int i = 0; i < len; i++) {
            System.arraycopy(matrix[i], 0, g[i], 0, len);
        }
        while (k > 0) {
            if ((k & 1) == 1) {
                Matrix.mutl(ans, g);
            }
            Matrix.mutl(g, g);
            k >>= 1;
        }
        return ans;
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int k = scanner.nextInt();
            int[][] matrix = new int[n][n];
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    matrix[i][j] = scanner.nextInt();
                }
            }
            int[][] ans = Matrix.powK(matrix, k);
            for (int i = 0; i < n; i++) {

                for (int j = 0; j < n; j++) {
                    System.out.print(ans[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
}

全部评论

相关推荐

牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务