728x90
https://www.acmicpc.net/problem/10830
10830번: 행렬 제곱
크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
1629 : 곱셈 ( hyunjiishailey.tistory.com/136 )
2740 : 행렬 곱셈 ( hyunjiishailey.tistory.com/138 )
( 위 두 문제의 콜라보 문제 )
import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
static int n = sc.nextInt(), p = 1000;
static long b = sc.nextLong();
static int a[][] = new int[n][n], r[][] = new int[n][n];
public static int[][] matrix_pow( long k ) {
if( k == 1 ) return r = a;
int t[][] = matrix_pow( k / 2 ), i, j, l; // tmp arr
int t_e[][] = new int[n][n]; // tmp arr - if k is even
for( i = 0; i < n; i++ )
for( j = 0; j < n; j++ )
for( l = 0; l < n; l++ )
t_e[i][j] += t[i][l] * t[l][j] % p;
r = t_e;
if( k % 2 == 1 ) {
int t_o[][] = new int[n][n]; // tmp arr - if k is odd
for( i = 0; i < n; i++ )
for( j = 0; j < n; j++ )
for( l = 0; l < n; l++ )
t_o[i][j] += t_e[i][l] * a[l][j] % p;
r = t_o;
}
for( i = 0; i < n; i++ )
for( j = 0; j < n; j++ )
r[i][j] %= p;
return r;
}
public static void main(String[] args) {
int i, j;
for( i = 0; i < n; i++ )
for( j = 0; j < n; j++ )
a[i][j] = sc.nextInt() % p;
sc.close();
matrix_pow( b );
for( i = 0; i < n; i++ ) {
for( j = 0; j < n; j++ )
System.out.print( r[i][j] + " " );
System.out.println();
}
}
}
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 6549 : 히스토그램에서 가장 큰 직사각형 / 분할 정복 (0) | 2020.08.28 |
---|---|
[백준(Baekjoon)][자바(java)] 2749 : 피보나치 수 3 / 분할 정복 (0) | 2020.08.26 |
[백준(Baekjoon)][자바(java)] 2740 : 행렬 곱셈 / 분할 정복 (0) | 2020.08.26 |
[백준(Baekjoon)][자바(java)] 11401 : 이항 계수 3 / 분할 정복 (0) | 2020.08.26 |
[백준(Baekjoon)][자바(java)] 1629 : 곱셈 / 분할 정복 (0) | 2020.08.26 |