본문 바로가기

백준

[백준] 10830 행렬 제곱 [자바]

 

 


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;
	}
}