#include<iostream>
using namespace std;
#include<vector>
#include<unordered_set>
#include<queue>
class Solution {
public:
int nthUglyNumber(int n) {
vector<int>factor = {2,3,5};//质因子 2、3 和 5
unordered_set<long>s;//集合去重
priority_queue<long,vector<long>,greater<long>>p;//升序队列,小顶堆
s.insert(1);
p.push(1);
int uglyn = 0;
for(int i = 0; i < n; i++){//遍历n次
long top = p.top();//取第i个堆顶
p.pop();
uglyn = (int)top;//丑数
for(int f:factor){
long temp = top*f;//2x,3x,5x
if(s.count(temp) == 0){//如果集合中不包括该元素,则加入
s.insert(temp);
p.push(temp);
}
}
}
return uglyn;
}
};
int main(){
int n;
cin >> n;
Solution s;
int u = s.nthUglyNumber(n);
cout << u;
}
class Solution {
public:
int nthUglyNumber(int n) {
vector<int>dp(n+1);
dp[1] = 1;
int p2 = 1,p3 = 1,p5 = 1;
for(int i = 2; i <= n; i++){
int num2 = dp[p2]*2;
int num3 = dp[p3]*3;
int num5 = dp[p5]*5;
dp[i] = min(min(num2,num3),num5);
if(dp[i] == num2){
p2++;
}
if(dp[i] == num3){
p3++;
}
if(dp[i] == num5){
p5++;
}
}
return dp[n];
}
};