제목 링크 : https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1178
이야기
완벽한 수는 소인수가 2, 3, 5, 7이거나 없음이라는 것입니다. n 번째 완전 수는 무엇입니까?
아이디어
가장 작은 완전 수는 1이고 각 완전 수에 2, 3, 5, 7을 곱하면 결과도 완전 수입니다. 그런 다음이 숫자를 우선 순위 대기열에 저장 한 다음 현재 가장 작은 숫자를 팝업하여 각각 2, 3, 5, 7을 곱합니다. 팝된 숫자는 응답 배열에 저장할 수 있습니다 (답변 데이터가 오름차순으로되어 있지 않은지 확인). 누락) 및 새로운 세대 번호가 우선 순위 대기열에 추가됩니다.
ac 코드
#include<bits/stdc++.h>
using namespace std;
#define ll long long
set<ll> s; //判断之前是否出现过
vector<ll> v; //计入答案数组
priority_queue<ll, vector<ll>, greater<ll> >q; //最小堆,堆顶是最小元素
int a[] = {2, 3, 5, 7};
void init(){
q.push(1);
for(int i = 1; i <= 5842; i ++){ //一共询问5842
ll tmp = q.top(); q.pop();
v.push_back(tmp); //计入答案数组,下标从0开始
for(int j = 0; j < 4; j ++){
ll tt = tmp * a[j]; //分别乘2 3 5 7
if(s.count(tt)) continue; //之前存在过,跳过
s.insert(tt);
q.push(tt);
}
}
}
int main(){
init();
int n;
while(~scanf("%d", &n)){
printf("%d\n", v[n - 1]); //下标从0开始,所以要-1
}
return 0;
}