๐ ์๊ณ ๋ฆฌ์ฆ ์ ํ
์ด ๋ฌธ์ ๋ ๋จ์ํ ํ๋์ ํ๋ ฌ์ ๊ณ์ํด์ ๊ณฑํด๋๊ฐ๋ ๋ฌธ์ ์ด์ง๋ง, ๊ทธ๋ ๋ค๊ณ ํ๋ ฌ์ ๊ณฑํ๋ ์ฐ์ฐ๋ง ๊ตฌํํ๋ค๋ฉด,, ์๊ฐ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ์ ๊ฑฐ๋ญ์ ๊ณฑ์ ์ง์๋ฅผ ๋ฐ์ผ๋ก ๋๋์ด๊ฐ๋ฉฐ ๋ถํ ์ ๋ณต(dp)ํด์ผ ํจ์จ์ ์ผ๋ก ์ฐ์ฐํ ์ ์๋ค.
์ง์๋ฅผ ๋ฐ์ผ๋ก ๋๋๋ ํ์์ ๋ถํ ์ ๋ณต ํ์ด๋ฒ์ ์์ ๋ฌธ์ '๋ฐฑ์ค 11401๋ฒ ์ดํญ๊ณ์ 3'์์ ๊ตฌํํ ์ ์ด ์๊ธฐ์ ๋์ฑ ์ฝ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
๐ ํ์ด
์ ์ฒด์ ์ธ ๊ตฌํ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
main()
1. ํ๋ ฌ์ ํฌ๊ธฐ N๊ณผ ์ง์ ๊ฐ B ์ ๋ ฅ๋ฐ๊ธฐ
- (์ฃผ์) ๋ฌธ์ ์์ B ๊ฐ์ ๋ฒ์๊ฐ 1 ≤ B ≤ 100,000,000,000 ์ด๋ฏ๋ก, B์ ํ์ ์ ์ ์ํด์ผ ํ๋ค.
- B์ ํ์ ์ long์ผ๋ก ํ์.
2. 2์ฐจ์์ ํ๋ ฌ ์ ๋ ฅ๋ฐ๊ธฐ
- pow ํจ์์์ ์ง์๊ฐ 1์ธ ๊ฒฝ์ฐ ํ๋ ฌ์ ๊ทธ๋๋ก ์ถ๋ ฅํ๋๋ก ํ๋๋ฐ, ๋ฌธ์ ์ ์กฐ๊ฑด ์ค ๊ฐ ์์๋ฅผ 1000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์, ํ๋ ฌ์ ์ ๋ ฅ ๋ฐ์ ๋๋ถํฐ 1000์ผ๋ก ๋๋ ๋๋จธ์ง ๊ฐ์ ์ ๋ ฅํ๋๋ก ํ์. (์ด๋ ๋ชจ๋๋ฌ ์ฐ์ฐ์ ๊ท์น์ ์ํด ๊ฐ๋ฅํ๋ค.)
3. ๊ฒฐ๊ณผ ํ๋ ฌ ์ถ๋ ฅํ๊ธฐ
pow(ํ๋ ฌ, ์ง์)
1. ์ง์๊ฐ 1์ผ ๊ฒฝ์ฐ ์ ๋ ฅ๋ฐ์ ํ๋ ฌ ๊ทธ๋๋ก ์ถ๋ ฅํ๊ธฐ
2. ์ง์๋ฅผ ์ ๋ฐ์ผ๋ก ๋ถํ ํ์ฌ ์ฌ๊ทํธ์ถํ๊ธฐ
3. ์ ๋ฐ์ผ๋ก ๋๋ ํ๋ ฌ์ multiple() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ ๊ณฑํ๊ธฐ
4. ์ง์๊ฐ ํ์์ผ ๊ฒฝ์ฐ ์๋ ํ๋ ฌ ํ๋ฒ ๋ ๊ณฑํด์ฃผ๊ธฐ
multiple(ํ๋ ฌ1, ํ๋ ฌ2)
1. ํ๋ ฌ ๊ณฑ์ ๊ตฌํํ๊ธฐ
๐ ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int P = 1000;
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
long B = Long.parseLong(st.nextToken()); // ํ์
์ฃผ์
map = new int[N][N];
// ํ๋ ฌ ์
๋ ฅ
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken()) % P;
}
}
// ํ๋ ฌ ๊ฑฐ๋ญ์ ๊ณฑ
int[][] result = pow(map, B);
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
sb.append(result[i][j]).append(' ');
}
sb.append('\n');
}
System.out.println(sb);
}
public static int[][] pow(int[][] base, long expo) {
//์ง์๊ฐ 1์ผ ๊ฒฝ์ฐ
if(expo == 1L)
return base;
// ์ง์๋ฅผ ์ ๋ฐ์ผ๋ก ๋ถํ ํ์ฌ ์ฌ๊ทํธ์ถ
int[][] ret = pow(base, expo/2);
// ์ ๋ฐ์ผ๋ก ๋๋ ํ๋ ฌ์ ์ ๊ณฑ
ret = multiply(ret, ret);
// ์ง์๊ฐ ํ์๋ผ๋ฉด
// base^(expo/2) * base^(expo/2) * base ์ด๋ค.
if(expo % 2 == 1L)
ret = multiply(ret, base);
return ret;
}
public 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] %= P;
}
}
}
return ret;
}
}
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 2749๋ฒ : ํผ๋ณด๋์น ์ 3 | JAVA (0) | 2023.03.21 |
---|---|
๋ฐฑ์ค 1722๋ฒ : ์์ด์ ์์ | JAVA (0) | 2023.03.20 |
๋ฐฑ์ค 11401๋ฒ : ์ดํญ ๊ณ์ 3 | JAVA (0) | 2023.03.13 |
๋ฐฑ์ค 3197๋ฒ : ๋ฐฑ์กฐ์ ํธ์ | JAVA (0) | 2023.03.12 |
๋ฐฑ์ค 1655๋ฒ : ๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ | JAVA (0) | 2023.03.10 |
๋๊ธ