题目描述 Description
对于自然数n,求前n个素因子仅有2,3或5的数,并从小到大输出到文件中。如N=10,答案为:2 3 4 5 6 8 9 10 12 15
输入描述 Input Description
一个正整数n(n<10000)
输出描述 Output Description
n个满足条件的正整数,以空格分开。
样例输入 Sample Input
10
样例输出 Sample Output
2 3 4 5 6 8 9 10 12 15
数据范围及提示 Data Size & Hint
无
#include<cstdio>
#include<map>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 5843
long long size,heap[N*N];
long long n,ans[N+8];
map<long long,bool> p;
long long top(){
int now,next;
long long res=heap[1];
now=1;heap[1]=heap[size--];
while(now*2<=size){
next=now*2;
if(next+1<=size&&heap[next+1]<heap[next]) next++;
if(heap[now]<heap[next]) break;
swap(heap[now],heap[next]);
now=next;
}
return res;
}
void pop(long long x){
if(p[x]) return;
else p[x]=true;
int now,next;
heap[++size]=x;
now=size;
while(now>1){
next=now/2;
if(heap[next]<heap[now]) break;
else swap(heap[next],heap[now]);
now=next;
}
}
void work(){
size=n=ans[1]=heap[1]=1;
while(n<N+2){
pop(ans[n]*2);
pop(ans[n]*3);
pop(ans[n]*5);
ans[++n]=top();
if(ans[n-1]==ans[n]) n--;
}
}
int main(){
work();
scanf("%d",&n);
for(int i=2;i<=n+1;i++) printf("%lld ",ans[i]);
return 0;
}