음준희 블로그
백준 2014 : 소수의 곱 c++ 본문
2014번: 소수의 곱
첫째 줄에 K(1 ≤ K ≤ 100), N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 K개의 소수가 오름차순으로 주어진다. 같은 소수가 여러 번 주어지는 경우는 없으며, 주어지는 소수는 모두 541보다 작거나
www.acmicpc.net
백준 2014번 소수의 곱
문제 링크입니다: https://www.acmicpc.net/problem/2014 흥미로운 우선순위 큐 문제였습니다. 알고리즘은 아래와 같습니다.1. 숫자를 중복 삽입하는 것을 방지하기 위해 map을 이용합니다.2. 소수의 곱을 우
jaimemin.tistory.com
해당 블로그를 참고했습니다.
풀이
1. 현재 가장 작은 수에 소수들을 모두 곱하여 우선순위큐에 삽입
2. 우선순위큐의 크기가 n보다 크거나 같고 큐안의 최대값보다 현재 곱이 클 경우 더 이상 삽입하지 않음
3. 중복 삽입을 제외하기 위해 set 사용
#include<bits/stdc++.h>
#include<time.h>
#define MAX 1000000007
#define INF 2000000000
#define MOD 1000000007
using namespace std;
typedef long long ll;
typedef pair<int, int > pii;
typedef pair<long long, long long> pll;
typedef pair<double, double> pdd;
int dx[8] = { 0, -1, 0, 1, 1, 1, -1, -1 };
int dy[8] = { -1, 0, 1, 0, -1, 1, 1, -1 };
/*
int dx[2][6] = {
{1, -1, 0, 0 ,1, -1},
{1, -1, 0, 0, -1, 1}
};
int dy[2][6] = {
{0, 0, 1, -1 ,1, -1},
{0, 0, 1, -1, 1, -1}
};*/
//int dx[8] = { -1, -1, 1, 1, -2, -2, 2, 2 };
//int dy[8] = { 2, -2, 2, -2, -1, 1, -1, 1 };
void init() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
}
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }
set<ll> check;
int main() {
init();
int k, n; cin >> k >> n;
int max_n = n;
vector<ll> v(k);
priority_queue<ll> pq;
for (int i = 0; i < k; i++)
cin >> v[i];
int mx = 0;
pq.push(-1);
while (n--) {
ll temp = -pq.top();
pq.pop();
for (int i = 0; i < k; i++) {
ll next = temp * v[i];
if (mx <= next && pq.size() >= max_n)
break;
if (!check.count(next)) {
check.insert(next);
pq.push(-next);
mx = max(next, ll(mx));
}
}
}
cout << -pq.top();
}
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 20442 : ㅋㅋ루ㅋㅋ (0) | 2022.12.31 |
|---|---|
| 백준 6137 : 문자열 생성 (0) | 2022.12.30 |
| 백준 1034 : 램프 c++ (0) | 2022.12.17 |
| 백준 1028 : 다이아몬드 광산 (0) | 2022.12.15 |
| 백준 2933 : 미네랄 c++ (0) | 2022.12.14 |