zcmu-1178: 完美的數(乘數累加)
阿新 • • 發佈:2018-11-24
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