zcmu1178: perfekte Nummer

Titellink: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1178

Thema

Die perfekte Zahl ist, dass sein Primfaktor nur 2, 3, 5, 7 oder keiner ist. Was ist die n-te perfekte Zahl?

Ideen

Die kleinste perfekte Zahl ist 1, und dann multiplizieren Sie jede perfekte Zahl mit 2, 3, 5 und 7, dann ist das Ergebnis auch eine perfekte Zahl. Speichern Sie diese Nummern dann in der Prioritätswarteschlange und öffnen Sie eine aktuell kleinste Zahl, um 2, 3, 5, 7 zu multiplizieren. Die gepumpten Nummern können im Antwortarray gespeichert werden (stellen Sie sicher, dass die Antwortdaten in aufsteigender Reihenfolge vorliegen und nicht verpasst) und die neue Generation Die Nummer wird der Prioritätswarteschlange hinzugefügt.

AC-Code

#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;
}

 

Ich denke du magst

Origin blog.csdn.net/weixin_43911947/article/details/113099835
Empfohlen
Rangfolge