1178: 完美的数
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 128 Solved: 82
[Submit][Status][Web Board]Description
一个数是否完美是这样定义的,如果这个数的素数因子只有2,3,5,7,那么这个数就是完美的.
显而易见前面几个完美的数为1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ...
你能告诉我第n个完美的数是多少嘛?
Input
多组测试数据.每组数据的第一行包含一个正整数n(1<= n<=5842).
Output
对于每组测试数据输出第n个完美的数
Sample Input
1 11 5842
Sample Output
1 12 2000000000
题目可以化简成:只用到2357这些素数相乘能组成哪些数,理解这句话就可以看下面的代码了
【通过代码】
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
int num[4] = {2,3,5,7};
set<ll> s;
priority_queue<ll,vector<ll>,greater<ll> > q;
vector<ll> v;
void init()
{
s.insert(1);
q.push(1);
for(int j = 1; j <= 5842;j++)
{
ll a = q.top();//取出当前最小的数 分别和2357相乘
q.pop();//当前使用这个数,所以从队列中删掉
v.push_back(a);//这个数是能够达到的,存到数组中去
for(int i = 0; i < 4;i++)
{
ll b = a * num[i];
if(!s.count(b))//set中没出现过的话---1
{
s.insert(b);
q.push(b);//添加到队列尾---2
}
}
}
}
int main()
{
init();
int n;
while(scanf("%d",&n) != EOF)
{
printf("%lld\n",v[n-1]);
}
return 0;
}
【运行部分过程】
队首元素: 1
2 = 1 * 2
3 = 1 * 3
5 = 1 * 5
7 = 1 * 7
队首元素: 2
4 = 2 * 2
6 = 2 * 3
10 = 2 * 5
14 = 2 * 7
队首元素: 3
6 = 3 * 2
9 = 3 * 3
15 = 3 * 5
21 = 3 * 7
队首元素: 4
8 = 4 * 2
12 = 4 * 3
20 = 4 * 5
28 = 4 * 7
队首元素: 5
10 = 5 * 2
15 = 5 * 3
25 = 5 * 5
35 = 5 * 7
队首元素: 6
12 = 6 * 2
18 = 6 * 3
30 = 6 * 5
42 = 6 * 7
队首元素: 7
14 = 7 * 2
21 = 7 * 3
35 = 7 * 5
49 = 7 * 7
队首元素: 8
16 = 8 * 2
24 = 8 * 3
40 = 8 * 5
56 = 8 * 7
队首元素: 9
18 = 9 * 2
27 = 9 * 3
45 = 9 * 5
63 = 9 * 7
队首元素: 10
20 = 10 * 2
30 = 10 * 3
50 = 10 * 5
70 = 10 * 7
队首元素: 12
24 = 12 * 2
36 = 12 * 3
60 = 12 * 5
84 = 12 * 7
队首元素: 14
28 = 14 * 2
42 = 14 * 3
70 = 14 * 5
98 = 14 * 7
队首元素: 15
30 = 15 * 2
45 = 15 * 3
75 = 15 * 5
105 = 15 * 7
队首元素: 16
32 = 16 * 2
48 = 16 * 3
80 = 16 * 5
112 = 16 * 7
队首元素: 18
36 = 18 * 2
54 = 18 * 3
90 = 18 * 5
126 = 18 * 7
队首元素: 20
40 = 20 * 2
60 = 20 * 3
100 = 20 * 5
140 = 20 * 7
队首元素: 21
42 = 21 * 2
63 = 21 * 3
105 = 21 * 5
147 = 21 * 7