※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts