OJ
[BOJ] 19699 소-난다! (JAVA)
P3PP4
2023. 4. 20. 10:00
https://www.acmicpc.net/problem/19699
19699번: 소-난다!
지난 번 헛간 청약의 당첨우(牛)가 발표됐다. 청약에 당첨된 소들은 날아갈 듯이 기뻐하다가 진짜로 하늘을 날았다. 하지만 이후로 소들은 날 수 없었다. 그러던 어느 날, 꿀벌에게 쏘이면 잠깐
www.acmicpc.net
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, M;
static int[] input;
static boolean[] notPrime;
static PriorityQueue<Integer> pq = new PriorityQueue<>();
public static void main(String[] args) throws Exception {
notPrime = new boolean[10000];
for (int i = 2; i < 10000; i++) {
if (!notPrime[i]) {
for (int j = i * 2; j < 10000; j += i) {
notPrime[j] = true;
}
}
} // sieve of Eratosthenes
st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
input = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
input[i] = Integer.parseInt(st.nextToken());
}
check(0, 0, 0);
if (pq.size() == 0) sb.append(-1);
else {
int pre = 0;
while (!pq.isEmpty()) {
int now = pq.poll();
if (now == pre) continue;
sb.append(now).append(" ");
pre = now;
}
}
System.out.print(sb);
}
static void check(int start, int sum, int cnt) {
if (cnt == M) {
if (!notPrime[sum]) pq.offer(sum);
return;
}
for (int i = start; i < N; i++) {
check(i + 1, sum + input[i], cnt + 1);
}
}
}