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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
//K : 소수의 개수
int K;
//N : 구해야하는 N번째! 
int N;
//초기 입력 소수들 저장 
vector<long long> prime;
//min heap 구성 
priority_queue<long longvector<long long>, greater<long long>> pq;
 
void input();
int getPrimeMux();
 
int main(void) {
    std::ios::sync_with_stdio(false);
    cin.tie(NULL);
    input();
    cout << getPrimeMux();
    return 0;
}
int getPrimeMux() {
    //N-1번째 수까지 반복 
    for (int i = 0; i < N - 1++i) {
        //가장 작은 수를 꺼낸다.
        long long minVal = pq.top(); 
        pq.pop();
        //가장 작은 수와 소수의 곱을 구한다.  
        for (auto p : prime) {
            pq.push(p * minVal);
            //중복제거 
            if (minVal % p == 0
                break;
        }
    }
    //N-1개의 최소 수를 빼고나면 pq의 top이 N번째 작은 수이다. 
    return pq.top();
}
void input() {
    cin >> K >> N;
    for (int i = 0; i < K; ++i) {
        long long num;
        cin >> num;
        pq.push(num);
        prime.push_back(num);
    }
}
cs
https://www.acmicpc.net/problem/2014 이게 블로그 보고 짠 코드인데 저기 중복제거하는 부분 if (minVal % p == 0) 이부분 어떻게 중복이 제거되는지 증명해놓은 블로그는 없는거같아서 물어봄 뭔가 어렴풋이 알거같긴한데 설명좀 해줄수 있는 갤럼있음?