设一个数为x=a^k,如果k是合数,k=m*n,那么x=(a^m)^n=(a^n)^m,这样这个数就是超级幂了。
首先1是答案,然后底数从2开始循环,指数最多是64,所以先扫一遍64以下的合数。底数的范围是65536,因为2以上的合数最小是4,65536^4已经超过最大值了。这样一个二重循环,把2到65536的每个数的合数次幂都加到答案里。
显然这些答案是有重复的,去重两种方法:
1.头文件<algorithm>中的unique函数
用法:1.先排序 2.unique(容器·起始地址,结束地址)..
这个函数必须作用于有序的序列,重复的元素并不删除,而是放到有序序列的后面。函数返回的是有序序列末地址的下一个位置。
和sort一样可以引入自定的比较函数,写法:
bool myfunction (int i, int j) {
return (i==j);
}
2.使用stl中的set:
set是自带去重和排序的,所以直接往里面insert就行了。遍历set要用迭代器,定义方法:set <数据类型>:: iterator p;
set也可以重载比较规则,但是规则要写成类的形式。如:
struct link_struct
{
int link_id;
int link_cost;
……
}
class link_compare
{
public:
bool link_compare::operator() (cost link_struct* first_link, cost link_struct* second_link)
{
return(first_link-> link_id < second_link-> link_id);
}
}
std::set <link_struct* , link_compare> set_link;
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#include <algorithm>
#include <set>
#define LL unsigned long long
LL pri[30000];
bool vis[70];
set <LL> res;
int main(){
LL Max=0;
for(int i=0;i<=63;i++){
Max+=(1ull<<i);
}
for(int i=2;i*i<=64;i++){
if(!vis[i]){
for(int j=i*i;j<=64;j+=i){
vis[j]=1;
}
}
}
int pn=0;
int num=0;
res.insert(1);
for(int i=2;i<=65536;i++){
LL tmp=i;
for(int j=1;j<=64;j++){
if(vis[j]){
res.insert(tmp);
}
if(tmp>Max/i) break;
else tmp*=i;
}
}
set<LL> :: iterator p;
for(p=res.begin();p!=res.end();p++){
printf("%llu\n",*p);
}
return 0;
}