来源:
http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=10907#problem/E
ACM International Collegiate Programming Contest, Asia-Amritapuri Site, 2011
题意:至少包含三个素数的数成为Lucky number,现在让求第n个Lucky number。
思路:由于n很小(1000),因此可以打表。把这1000个数预处理出来,直接输出即可。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
using namespace std;
#define CLR(arr,val) memset(arr,val,sizeof(val))
const int N = 100000;
int flag[N],ans[1010];
void init(){
CLR(flag,0);
for(int i = 2; i <= sqrt(N + 0.5); ++i){
if(!flag[i]){
for(int j = i * 2; j < N; j += i)
flag[j] = 1;
}
}
int K = 1;
for(int i = 30;;++i){
int cnt = 0;
if(!flag[i])
continue;
int s = i;
for(int j = 2;j < N;++j){
if(flag[j])
continue;
if(s % j == 0){
cnt++;
while(s%j == 0)
s /= j;
}
if(cnt >= 3){
ans[K++] = i;
break;
}
}
if(K > 1001)
break;
}
}
int main(){
init();
int numcase;
scanf("%d",&numcase);
while(numcase--){
int n;
scanf("%d",&n);
printf("%d\n",ans[n]);
}
return 0;
}