解题思路:任意的一个次方数(既可以表示为p^k的数,k,p>1整数,)都可以化成底数是一个非次方数,则指数做出相应改变即可。那么一个数是否是Super Power Numbers就看他是不是一个次方数,让他的底数变成非次方数,然后看其相应指数是非质数就可以了。因为最小非质数(除了1)就是4了,那么p的取值其他最大就是1e5就够了,我们可以通过找出1e5之内的质数,然后再根据要求求得Super Power Numbers就可以了。
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int mx = 1e5+10;
const ull INF = pow(2,64) - 1;
int n,pri[mx],tot;
bool vis[mx],vic[mx];
void init()
{
for(int i=2;i<mx;i++){
if(!vic[i]) pri[tot++] = i;
for(int j=0;j<tot&&pri[j]*i<mx;j++)
{
vic[i*pri[j]] = 1;
if(i%pri[j]==0) break;
}
}
}
ull num[mx];
int main()
{
init();
int top = 0;
for(int i=2;i<mx;i++){
if(vis[i]) continue;//不考虑次方数做底数
int j = 2;
ull val = 1ll*i;
while(val<=INF/i){
val *= i;
if(val<mx) vis[val] = 1;//底数是次方数的筛掉
if(vic[j++]) num[top++] = val;
}
}
puts("1"),sort(num,num+top);
for(int i=0;i<top;i++)
printf("%llu\n",num[i]);
return 0;
}