Skip to content

Commit 4db86cc

Browse files
committed
[Gold IV] Title: 행렬 제곱, Time: 108 ms, Memory: 14284 KB -BaekjoonHub
1 parent bbd9519 commit 4db86cc

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# [Gold IV] 행렬 제곱 - 10830
2+
3+
[문제 링크](https://www.acmicpc.net/problem/10830)
4+
5+
### 성능 요약
6+
7+
메모리: 14284 KB, 시간: 108 ms
8+
9+
### 분류
10+
11+
수학, 분할 정복, 분할 정복을 이용한 거듭제곱, 선형대수학
12+
13+
### 제출 일자
14+
15+
2025년 10월 30일 23:00:33
16+
17+
### 문제 설명
18+
19+
<p>크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다.</p>
20+
21+
### 입력
22+
23+
<p>첫째 줄에 행렬의 크기 N과 B가 주어진다. (2 ≤ N ≤ 5, 1 ≤ B ≤ 100,000,000,000)</p>
24+
25+
<p>둘째 줄부터 N개의 줄에 행렬의 각 원소가 주어진다. 행렬의 각 원소는 1,000보다 작거나 같은 자연수 또는 0이다.</p>
26+
27+
### 출력
28+
29+
<p>첫째 줄부터 N개의 줄에 걸쳐 행렬 A를 B제곱한 결과를 출력한다.</p>
30+
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
static int N;
6+
static long B;
7+
8+
static int[][] pow(int[][] A, long e) {
9+
int[][] B = new int[N][N];
10+
for (int i = 0; i < N; i++) {
11+
System.arraycopy(A[i], 0, B[i], 0, N);
12+
}
13+
if (e == 1) {
14+
return B;
15+
}
16+
int[][] half = pow(A, e / 2);
17+
int[][] res = mul(half, half);
18+
if ((e & 1L) == 1L) res = mul(res, A);
19+
return res;
20+
}
21+
22+
static int[][] mul(int[][] X, int[][] Y) {
23+
int[][] Z = new int[N][N];
24+
for (int i = 0; i < N; i++) {
25+
for (int k = 0; k < N; k++) {
26+
for (int j = 0; j < N; j++) {
27+
Z[i][j] = (int)((Z[i][j] + (long) X[i][k] * Y[k][j]) % 1000);
28+
}
29+
}
30+
}
31+
return Z;
32+
}
33+
34+
35+
public static void main(String[] args) throws IOException {
36+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
37+
StringTokenizer st = new StringTokenizer(br.readLine());
38+
N = Integer.parseInt(st.nextToken());
39+
B = Long.parseLong(st.nextToken());
40+
41+
int[][] A = new int[N][N];
42+
for (int i = 0; i < N; i++) {
43+
st = new StringTokenizer(br.readLine());
44+
for (int j = 0; j < N; j++) {
45+
A[i][j] = Integer.parseInt(st.nextToken()) % 1000;
46+
}
47+
}
48+
49+
int[][] ans = pow(A, B);
50+
51+
StringBuilder sb = new StringBuilder();
52+
for (int i = 0; i < N; i++) {
53+
for (int j = 0; j < N; j++) {
54+
sb.append(ans[i][j]);
55+
if (j + 1 < N) sb.append(' ');
56+
}
57+
sb.append('\n');
58+
}
59+
System.out.print(sb.toString());
60+
}
61+
}

0 commit comments

Comments
 (0)