์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ํ๋ฌํฐ ๊ฐ๋ฐํ๊ฒฝ ์ค์
- ์๋ฐ ์คํ๋ง
- Flutter
- JAVA SPRING
- SWEA
- spring
- ํ์ด์ฝ ์ด๋์ฝ๋
- ํ์ด์ฝ ์ถ์ฒ์ธ์ฝ๋
- C์ธ์ด
- C
- ์คํ๋ง
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์์
- ๋ฐฐ์ด
- ํ์ด์ฝ ์น๊ตฌ์ฝ๋
- ํ์ด์ฝ ์ถ์ฒ์ธ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ
- ํ์ ๋ถ๊ธฐ
- php ํ๋ก๊ทธ๋๋ฐ
- Java
- php
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์ฐ์ต๋ฌธ์
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ๋ฌธ์ ํ์ด
- ํ์ด์ฌ
- ์๋ฐ
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ 3ํ
- ํ๋ฌํฐ
- ์ต๋จ ๊ฒฝ๋ก
- programmers
- php ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ ์๋ฃจ์
- ๋ฐฑ์ค
- Today
- Total
ImJay
[BOJ/Java] 5266. Strange Dream ๋ณธ๋ฌธ
๐ [BOJ/Java] 5266. Strange Dream
๐ ๋ฌธ์ ๋งํฌ: ๋ฌธ์ ๋ณด๊ธฐ
๐ ๋ฌธ์ ํด์
Dumitru๊ฐ ์ด์ํ ๊ฟ์ ๊ฟจ๋ค. ๊ฟ์์์ ๋ฌธ์ด ์ ๊ธด ๋ฐฉ์ ๊ฐํ Dumitru๋ n๊ฐ์ ๋ฐ์ค๋ฅผ ๋ฐ๊ฒฌํ๋ค. ๊ฐ ๋ฐ์ค์๋ m๊ฐ์ ์ ์๊ฐ ์์๊ณ , ๊ฐ ์ ์์๋ 1 ์ด์์ ์ ์๊ฐ ์ ํ ์์๋ค. ๊ทธ๋ฌ๋ ์ค ๋ ๊ฐ์ ์ ์ k์ l์ด ์ ํ ์ชฝ์ง๋ฅผ ๋ฐ๊ฒฌํ๋ค. ์ชฝ์ง์๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ํ๋ผ๊ณ ๋์ด ์์๋ค.
1๋จ๊ณ: ์ฒซ ๋ฒ์งธ ๋ฐ์ค๋ถํฐ n๋ฒ์งธ ๋ฐ์ค๊น์ง ์์๋๋ก ๊ฐ ๋ฐ์ค์์ ํ ๊ฐ์ ์ ์๋ฅผ ์ ํํ๋ค. ์ ํํ ์ ์์ ์ซ์๋ฅผ ๋ ธํธ์ ๊ธฐ๋กํ ํ, ํด๋น ์ ์์ ์ซ์๋ฅผ 1๋ก ๋ฐ๊พผ๋ค.
2๋จ๊ณ: n-1๋ฒ์งธ ๋ฐ์ค๋ถํฐ ๋ ๋ฒ์งธ ๋ฐ์ค๊น์ง ์ญ์์ผ๋ก ๊ฐ ๋ฐ์ค์์ ํ ๊ฐ์ ์ ์๋ฅผ ์ ํํ๋ค.
๋ชฉํ๋ ๋ ธํธ์ ๊ธฐ๋ก๋ ์ซ์๋ค์ ๊ณฑ์ด k๋ก ๋๋์ด ๋จ์ด์ง๋๋ก ํ๋ ์ ํ ๋ฐฉ๋ฒ์ ์ด ๊ฐ์ง์ T๋ฅผ ๊ตฌํ๊ณ , T๋ฅผ l๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
โ ํต์ฌ ๊ฐ๋
- ์ ์๋ก ๊ณผ gcd๋ฅผ ํ์ฉํด k์ ์ฝ์๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ๊ฐ ๋ฐ์ค๋ณ ์ ์ ์ ํ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌ๋ถํด ๊ณ์ฐํ๋ค.
- ๋์ ๊ณํ๋ฒ(DP)์ ํตํด ์ํ ์ ์ด๋ฅผ ๋์ ํ๋ค.
๐ ๏ธ ํ์ด ๊ณผ์
๋จผ์ ์ ๋ ฅ์ผ๋ก n, m, k, l๊ณผ ๊ฐ ๋ฐ์ค์ ์ ์์ ์ ํ ์๋ฅผ ๋ฐ์๋ค. k์ ๋ชจ๋ ์ฝ์๋ฅผ ๊ตฌํด ๊ฐ ์ฝ์๋ฅผ ์ํ๋ก ์ฌ์ฉํ๊ณ , ์ฝ์์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ๋งคํํ๋ค.
๊ฐ ๋ฐ์ค๋ง๋ค ์ ์ ์ ํ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ค. ์ฒซ ๋ฒ์งธ ๋ฐ์ค์ ๋ง์ง๋ง ๋ฐ์ค๋ ์ ์๋ฅผ ํ ๋ฒ๋ง ์ ํํ๋ฏ๋ก ๊ฐ ์ ์๊ฐ ๊ธฐ์ฌํ๋ ๊ฐ์ด ๊ทธ๋๋ก ๋ฐ์๋์๋ค.
์ค๊ฐ ๋ฐ์ค๋ ๋ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ด, ๊ฐ์ ์ ์๋ฅผ ๋ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ(๋ ๋ฒ์งธ ์ ํ ์ 1์ด ๊ธฐ๋ก๋จ)์ ์๋ก ๋ค๋ฅธ ์ ์๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๊ณ ๋ คํ๋ค.
DP ๋ฐฐ์ด์ ์ด์ฉํด ๊ฐ ๋ฐ์ค์์ ๊ณ์ฐ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์ ํ๋ฉฐ ์ํ ์ ์ด๋ฅผ ์งํํ๋ค. ํ์ฌ ์ํ๋ ์ง๊ธ๊น์ง ์ ํํ ์ ์๋ค์ ์ซ์ ๊ณฑ์ gcd(k, ·) ๊ฐ์ผ๋ก ํํ๋๋ค.
๋ชจ๋ ๋ฐ์ค๋ฅผ ์ฒ๋ฆฌํ ํ, ์ต์ข ์ํ๊ฐ k๋ก ๋๋์ด ๋จ์ด์ง๋ ๊ฒฝ์ฐ์ ์๋ฅผ l๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
๐ป ์ฝ๋ ๊ตฌํ (Java)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// ์
๋ ฅ์ ์ํ BufferedReader ์ด๊ธฐํ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// ์ฒซ ๋ฒ์งธ ์ค: n (๋ฐ์ค ๊ฐ์), m (๊ฐ ๋ฐ์ค ๋น ์ ์ ๊ฐ์) ์
๋ ฅ
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
// ๋ ๋ฒ์งธ ์ค: k (๋ชฉํ ๋ฐฐ์), mod (๋๋จธ์ง ์ฐ์ฐ ๋ชจ๋) ์
๋ ฅ
st = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st.nextToken());
int mod = Integer.parseInt(st.nextToken());
// k์ ๋ชจ๋ ์ฝ์๋ฅผ ๊ตฌํจ (๊ฐ ์ํ๋ฅผ ์ฝ์๋ก ์ฌ์ฉ)
ArrayList<Integer> dlist = new ArrayList<>();
for (int i = 1; i * i <= k; i++) {
if (k % i == 0) {
dlist.add(i);
if (i * i != k)
dlist.add(k / i);
}
}
// ์ฝ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
Collections.sort(dlist);
int dCount = dlist.size();
int[] dArr = new int[dCount];
for (int i = 0; i < dCount; i++) {
dArr[i] = dlist.get(i);
}
// ๊ฐ ์ฝ์์ ์ธ๋ฑ์ค๋ฅผ ๋งคํ (์ํ ์ ์ด ํ
์ด๋ธ ๊ตฌ์ฑ์ ์ฌ์ฉ)
HashMap<Integer, Integer> dIndex = new HashMap<>();
for (int i = 0; i < dCount; i++) {
dIndex.put(dArr[i], i);
}
// ๋ ์ํ์ ๊ณฑ์
๊ฒฐ๊ณผ์ gcd(k, ๊ณฑ)์ผ๋ก ์ ์ด๋๋ ์ํ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐ (์ํ ์ ์ด ํ
์ด๋ธ)
int[][] mult = new int[dCount][dCount];
for (int i = 0; i < dCount; i++) {
for (int j = 0; j < dCount; j++) {
long prod = (long) dArr[i] * dArr[j];
int g = (int) gcd(prod, k);
mult[i][j] = dIndex.get(g);
}
}
// dp ๋ฐฐ์ด ์ด๊ธฐํ (ํ์ฌ ์ํ๋ณ ๊ฒฝ์ฐ์ ์ ์ ์ฅ)
int[] dp = new int[dCount];
// ์ด๊ธฐ ์ํ๋ 1 (๊ณฑ์ ๊ฒฐ๊ณผ๊ฐ 1)์ธ ์ํ์์ ์์
dp[dIndex.get(1)] = 1;
// ๊ฐ ๋ฐ์ค๋ณ๋ก ์ฒ๋ฆฌ (์ด n๊ฐ์ ๋ฐ์ค)
for (int box = 1; box <= n; box++) {
// ๊ฐ ๋ฐ์ค ๋ด์์ ์ฝ์ ์ํ์ ํด๋นํ๋ ์ ์ ๊ฐ์ ์นด์ดํธ
int[] freq = new int[dCount];
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
int val = Integer.parseInt(st.nextToken());
int g = (int) gcd(val, k);
int idx = dIndex.get(g);
freq[idx]++; // ํด๋น ์ฝ์ ์ํ์ ํด๋นํ๋ ์ ์ ๊ฐ์ ์ฆ๊ฐ
}
// ํ์ฌ ๋ฐ์ค์์ ์ ํํ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ ๋ฐฐ์ด
int[] boxDist = new int[dCount];
if (box == 1 || box == n) {
// ์ฒซ ๋ฒ์งธ ๋ฐ์ค์ ๋ง์ง๋ง ๋ฐ์ค๋ ํ ๋ฒ๋ง ์ ํํ๋ฏ๋ก ๊ทธ๋๋ก ์ฌ์ฉ
for (int i = 0; i < dCount; i++) {
boxDist[i] = freq[i] % mod;
}
} else {
// ์ค๊ฐ ๋ฐ์ค๋ ๋ ๋ฒ ์ ํํจ (ํ ๋ฒ์ ๊ธฐ๋ก ํ 1๋ก ๋ณ๊ฒฝ, ๋ ๋ฒ ์ ํ ์ ๊ณฑ์ ์ํฅ ์์)
int[] doubleDist = new int[dCount];
// ๋จผ์ ํ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ (๊ธฐ๋ณธ์ ์ผ๋ก freq ๊ฐ์ ๋ํจ)
for (int i = 0; i < dCount; i++) {
doubleDist[i] = (doubleDist[i] + freq[i]) % mod;
}
// ๋ ๋ฒ์งธ ์ ํ์ ๊ฒฝ์ฐ: ๊ฐ์ ์ ์ ๋๋ ๋ค๋ฅธ ์ ์ ์ ํ ๊ฒฝ์ฐ ๊ณ ๋ ค
for (int i = 0; i < dCount; i++) {
for (int j = 0; j < dCount; j++) {
// i์ j๊ฐ ๊ฐ์ ๊ฒฝ์ฐ: ๊ฐ์ ์ ์๋ฅผ ๋ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ
// i์ j๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ: ์๋ก ๋ค๋ฅธ ์ ์๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ
long ways = (i == j) ? (long) freq[i] * (freq[i] - 1) : (long) freq[i] * freq[j];
if (ways == 0)
continue;
int idx = mult[i][j];
doubleDist[idx] = (int) ((doubleDist[idx] + ways) % mod);
}
}
boxDist = doubleDist;
}
// ํ์ฌ๊น์ง์ dp์ ์ด๋ฒ ๋ฐ์ค์ boxDist๋ฅผ ์ด์ฉํด ๋ค์ ์ํ(ndp)๋ฅผ ๊ณ์ฐ
int[] ndp = new int[dCount];
for (int i = 0; i < dCount; i++) {
if (dp[i] == 0)
continue;
for (int j = 0; j < dCount; j++) {
if (boxDist[j] == 0)
continue;
int ns = mult[i][j]; // ํ์ฌ ์ํ i์์ ๋ฐ์ค์ ์ ํ j๋ฅผ ์ ์ฉํ ์๋ก์ด ์ํ
ndp[ns] = (int) ((ndp[ns] + (long) dp[i] * boxDist[j]) % mod);
}
}
// dp ๋ฐฐ์ด ๊ฐฑ์
dp = ndp;
}
// ์ต์ข
์ ์ผ๋ก dp ๋ฐฐ์ด์์ ๋ชฉํ ์ํ k (์ฆ, ์ฝ์ ์ํ๊ฐ k๊ฐ ๋๋ ๊ฒฝ์ฐ)์ ๊ฐ์ ์ถ๋ ฅ
System.out.println(dp[dIndex.get(k)] % mod);
}
// ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ด์ฉํ ์ต๋๊ณต์ฝ์(GCD) ๊ณ์ฐ ๋ฉ์๋
static long gcd(long a, long b) {
while (b != 0) {
long t = a % b;
a = b;
b = t;
}
return a;
}
}
โฑ๏ธ ์๊ฐ ๋ณต์ก๋ ๋ถ์
๋ฌธ์ ๋ ๊ฐ ๋ฐ์ค๋ง๋ค m๊ฐ์ ์ ์๋ฅผ ์ฒ๋ฆฌํ๊ณ , k์ ์ฝ์ ๊ฐ์๋ฅผ d๋ผ ํ ๋ O(n*m + n*d²)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
n์ ์ต๋ 200, m์ ์ต๋ 10,000์ด๋ฉฐ, d๋ k์ ์ฝ์ ๊ฐ์๋ก ๋ณดํต √k์ ๊ฐ๊น์ ์ ํ ๋ด์์ ์ถฉ๋ถํ ๊ณ์ฐ๋๋ค.
๐ก ๋๋์
๋ฌธ์ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ ๋ฐ์ค์์์ ์ ์ ์ ํ์ ๋ฐ๋ฅธ ์ํ ์ ์ด๋ฅผ ๋ช
ํํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ ์ด์ ์ ๋์๋ค.
์ ์๋ก ๊ณผ gcd๋ฅผ ํ์ฉํด k์ ์ฝ์๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ ์ํ ์ ์ด ํ
์ด๋ธ์ ๊ตฌ์ฑํ ์ ์ด ์ธ์์ ์ด๋ค.
๋์ผํ ๋ฐ์ค์์ ์ ์๋ฅผ ๋ ๋ฒ ์ ํํ๋ ๊ฒฝ์ฐ๋ฅผ ์ธ๋ฐํ๊ฒ ๊ณ ๋ คํ ์ ์ด ๋ฌธ์ ํด๊ฒฐ์ ํต์ฌ ํฌ์ธํธ์๋ค.
'์๊ณ ๋ฆฌ์ฆ > BOJ - Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/Java] 3628. Knockdown (0) | 2025.03.14 |
---|---|
[BOJ/Java] 6902. Orko (1) | 2025.03.13 |
[BOJ/Java] 11404. ํ๋ก์ด๋ (1) | 2025.03.10 |
[BOJ/Java] 2931. ๊ฐ์ค๊ด (0) | 2025.03.10 |
[BOJ/Java] 11657. ํ์๋จธ์ (0) | 2025.03.10 |