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 long, vector<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 |
댓글 0