zcmu1178: número perfecto

Enlace de título: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1178

Tema

El número perfecto es que su factor primo es solo 2, 3, 5, 7 o ninguno. ¿Cuál es el enésimo número perfecto?

Ideas

El número perfecto más pequeño es 1, y luego multiplica cada número perfecto por 2, 3, 5 y 7, entonces el resultado también es un número perfecto. Luego, guarde estos números en la cola de prioridad y luego muestre el número más pequeño actual para multiplicar 2, 3, 5, 7 respectivamente. Los números revelados se pueden almacenar en la matriz de respuestas (asegúrese de que los datos de respuesta estén en orden ascendente y no perdido), y la nueva generación El número se agrega a la cola de prioridad.

código 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;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43911947/article/details/113099835
Recomendado
Clasificación