题意:如果一个数至少是两个不同的正整数的幂,那么它被称为超级幂,按升序输出1至2^64-1之间的所有超级幂。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <set>
using namespace std;
typedef unsigned long long LL;
bool prime[70];
set<LL> s;
set<LL>::iterator it;
int top(int a)
{
return ceil(64/(log(a)/log(2.0))) - 1;
}
void isprime()
{
int i,j;
memset(prime,true,sizeof(prime));
for(i=2;i<70;i++)
{
if(prime[i])
{
for(j=i+i;j<70;j+=i)
prime[j] = false;
}
}
}
int main()
{
isprime();
s.clear();
cout<<"1"<<endl;
for(LL i = 2;i<(1<<16);i++)
{
int tp = top(i);
LL num = i;
for(int j=2;j<=tp;j++)
{
num *= i;
if(prime[j]) continue;
if(s.count(num) == 0) s.insert(num);
}
}
for(it = s.begin();it != s.end();it++)
cout<<*it<<endl;
return 0;
}