思路:当一个数的指数是合数的时候那么这个数就符合题目的要求,所以从2到1<<16,开始暴力枚举他们的指数,是合数的就加入set,因为4是最小的合数,所以到1<<16即可。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<math.h> 6 #include<set> 7 #include<queue> 8 using namespace std; 9 typedef unsigned long long LL; 10 bool prime[70]; 11 int ans[70]; 12 LL ak = (LL)(1<<64)-1; 13 set<LL>val; 14 set<LL>::iterator it; 15 int main(void) 16 { 17 int i,j; 18 int cn = 0;memset(prime,0,sizeof(prime)); 19 for(i = 2; i < 64 ; i++) 20 { 21 if(!prime[i]) 22 { 23 for(j = i; (i*j) < 64 ; j++) 24 { 25 prime[i*j] = true; 26 } 27 } 28 } 29 for(i = 2 ; i < (1<<16); i++) 30 { LL tp = 1; 31 for(j = 1 ; j < 64; j++) 32 { 33 if(ak/tp < i) 34 { 35 break; 36 } 37 else if(prime[j]) 38 { 39 tp*=(LL)i; 40 val.insert(tp); 41 } 42 else tp*=(LL)i; 43 } 44 }int er =0 ;printf("1\n"); 45 for(it = val.begin(); it!= val.end(); it++) 46 { er++; 47 printf("%llu\n",*it); 48 } 49 return 0; 50 }