/*
求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;
}