/* 求1到2^64-1之间的数,这个数至少有两个不同数的正整数的幂,按从小到大的顺序输出! 要是两个不同正整数的幂,则它必定是一个正整数的合数幂(这样才可以继续分解出另外一个数的幂形式) */ #include <algorithm> #include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <map> #include <set> using namespace std; typedef long long LL; typedef unsigned long long ULL; const LL MAXN = 1e6; const ULL INF = (1 << 64) - 1; bool num[MAXN]; void init() { LL i, j, k = 0; for(i = 2; i * i <= 64; i++) { if(!num[i]) { for(j = i * 2; j <= 64; j += i) num[j] = true; } } } int main() { init(); set<ULL>st; st.insert(1); int i, j, k = 0; /*合数最小是4,对应的底数是2^16*/ for(i = 2; i <= 1 << 16; i++) { ULL sum = 1; for(j = 1; j <= 64; j++) { sum *= i; if(num[j]) st.insert(sum); if(sum > INF / i) break; } } set<ULL>::iterator it; for(it = st.begin(); it != st.end(); it++) cout << *it << endl; return 0; }