못생긴 수란 오직 2, 3, 5만을 소인수Prime Factor로 가지는 수를 의미합니다. 다시 말해 오직 2, 3, 5를 약수로 가지는 합성수를 의미합니다. 1은 못생긴수라고 가정합니다. 따라서 못생긴 수들은 {1, 2, 3, 4 ,5, 6, 8, 9, 10, 12, 15, ... } 순으로 이어지게 됩니다. 이떄, n번째 못생긴 수를 찾는 프로그램을 작성하세요. 예를 들어 11번째 못생긴 수는 15입니다.
(2번째 못생긴수)와 (24번째 못생긴 수)의 1의 자리 수가 같고 정확히 십의 자리는 30차이 난다.(i번째 못생긴수 + 30) = (i+22번째 못생긴 수)n = 1 + (22 * cnt + d)d = (n-1) % 22cnt = (n-1) // 22answer = cnt * 30 + darr[d-1]도 고려해보았는데 음수가 나올 수도 있어서 배제하였다.0 + 30 = 30 적절했다.물론 책 해설은 이렇게 안 되어있었는데 이것도 되지 않을까 싶다...
해설은 O(N)이었다.
온라인 저지 없어서 확인 해볼 방법이 없다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[22] = { 0, 2, 3, 4, 5, 6, 8, 9, 10,
12, 14, 15, 16, 18, 20,
21, 22, 24, 25, 26, 27, 28
};
int main(){
int n;
cin >> n;
if (n == 1) {
cout << 1 << endl;
return 0;
}
int d = (n - 1) % 22;
int cnt = (n - 1) / 22;
int answer = cnt * 30 + arr[d];
cout << answer << endl;
}