用java解决POJ3233—矩阵幂序列问题
时间: 2024-06-13 13:06:50 浏览: 134
利用java进行矩阵运算
3星 · 编辑精心推荐
以下是Java解决POJ3233—矩阵幂序列问题的代码和解释:
```java
import java.util.Scanner;
public class Main {
static int n, k, m;
static int[][] A, E;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();
m = sc.nextInt();
A = new int[n][n];
E = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[i][j] = sc.nextInt() % m;
E[i][j] = (i == j) ? 1 : 0;
}
}
int[][] res = matrixPow(A, k);
int[][] ans = matrixAdd(res, E);
printMatrix(ans);
}
// 矩阵乘法
public static int[][] matrixMul(int[][] a, int[][] b) {
int[][] c = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % m;
}
}
}
return c;
}
// 矩阵快速幂
public static int[][] matrixPow(int[][] a, int b) {
int[][] res = E;
while (b > 0) {
if ((b & 1) == 1) {
res = matrixMul(res, a);
}
a = matrixMul(a, a);
b >>= 1;
}
return res;
}
// 矩阵加法
public static int[][] matrixAdd(int[][] a, int[][] b) {
int[][] c = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
c[i][j] = (a[i][j] + b[i][j]) % m;
}
}
return c;
}
// 输出矩阵
public static void printMatrix(int[][] a) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
}
```
解释:
1. 首先读入输入的n、k、m和矩阵A,同时初始化单位矩阵E。
2. 然后调用matrixPow函数求出A的k次幂矩阵res。
3. 最后将res和E相加得到结果ans,并输出。
4. matrixMul函数实现矩阵乘法,matrixPow函数实现矩阵快速幂,matrixAdd函数实现矩阵加法,printMatrix函数实现输出矩阵。
阅读全文