※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 7868번 문제인 해밍 수열이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/7868
7868번: 해밍 수열
세 소수 p1, p2, p3을 이용해서 해밍 수열 H(p1, p2, p3), i = 1... 을 정의할 수 있다. 해밍 수열 H(p1, p2, p3)은 소인수가 p1, p2, p3로만 이루어진 자연수의 오름 차순 목록이다. 예를 들어, H(2, 3, 5) = 2, 3, 4, 5,
www.acmicpc.net
p1, p2 및 p3만을 소인수로 갖는 10^18 미만인 양의 정수의 개수가 충분히 적다는 점을 이용해, p1, p2 및 p3만을 소인수로 갖는 10^18 미만인 양의 정수를 전부 구하고 i번째 수를 찾아내는 것으로 문제를 해결할 수 있다.
p1의 개수, p2의 개수, p3의 개수를 하나씩 늘려나가보며 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
ll p1, p2, p3; int i;
vector<ll> vec;
void fp3(ll cur) {
vec.emplace_back(cur);
if (cur <= 1000000000000000000LL / p3) fp3(cur * p3);
}
void fp2(ll cur) {
fp3(cur);
if (cur <= 1000000000000000000LL / p2) fp2(cur * p2);
}
void fp1(ll cur) {
fp2(cur);
if (cur <= 1000000000000000000LL / p1) fp1(cur * p1);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> p1 >> p2 >> p3 >> i;
fp1(1);
sort(vec.begin(), vec.end());
cout << vec[i];
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14370 // C++] 전화번호 수수께끼 (Large) (0) | 2023.04.29 |
---|---|
[BOJ 3007 // C++] 숫자 원 (0) | 2023.04.28 |
[BOJ 7869 // C++] 두 원 (0) | 2023.04.26 |
[BOJ 2693 // C++] N번째 큰 수 (0) | 2023.04.25 |
[BOJ 2701 // C++] 육각 퍼즐 (0) | 2023.04.24 |