백준
[백준] 10830 행렬 제곱 [자바]
거북이같은곰
2023. 1. 16. 21:29
https://st-lab.tistory.com/251
[백준] 10830번 : 행렬 제곱 - JAVA [자바]
https://www.acmicpc.net/problem/10830 10830번: 행렬 제곱 크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머
st-lab.tistory.com
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[][] origin;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
long B = Long.parseLong(st.nextToken());
origin = new int[N][N];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < N; j++) {
origin[i][j] = Integer.parseInt(st.nextToken()) % 1000;
}
}
int[][] result = pow(origin, B);
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
sb.append(result[i][j]+" ");
}
sb.append('\n');
}
System.out.println(sb);
}
static int[][] pow(int [][] A, long exponential) {
if(exponential == 1L) {
return A;
}
int[][] ret = pow(A, exponential/2);
ret = multiply(ret, ret);
if(exponential % 2 == 1L) {
ret = multiply(ret, origin);
}
return ret;
}
static int[][] multiply(int[][] o1, int[][] o2) {
int[][] ret= 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++) {
ret[i][j] += o1[i][k] * o2[k][j];
ret[i][j] %= 1000;
}
}
}
return ret;
}
}