问题描述(机翻,能看懂就行)
我们都知道这个世界上的超级大国是如何在政治斗争中取得优势的
甚至在其他领域也是如此。但这不是一个政治平台,所以我们将讨论另一种
超级大国-“超级大国的数字”。一个正数被称为超级大国,当它
是至少两个不同正整数的幂。例如64是一个超级幂64 = 82
64 = 43
。您必须编写一个程序,列出1和264 - 1(包括)内的所有超级能力。
输入
这个程序没有输入。
输出
打印1和264 - 1内的所有超幂数。每一行都包含一个超级幂
数字和数字按升序打印。
注意:记住这个问题没有输入。样本输出只是部分解
Sample Output
1
16
64
81
256
512
.
.
.
分析:
一个数的合数次幂(且大于等于4)符合条件,因为合数可以拆,
如315=33*5=35*3
33*5=95
35*3=2433
所以315符合条件
素数次幂不能拆所以素数次幂不符合
因为合数次幂要求大于等于4,所以底数最大216因为216的4次幂等于264
幂次数量最大64因为底数最小的的时候2可以到达264
枚举2到216底数,其合数次幂的数值即为答案之一
另外:答案要用set去重+排序,
code:
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
typedef unsigned long long ull;
int mark[70];//标记素数
int main(){
for(int i=2;i<=64;i++){
mark[i]=1;
}
for(int i=2;i<=64;i++){//素数筛
for(int j=i+i;j<=64;j+=i){
mark[j]=0;
}
}
set<ull>s;//set存答案+去重+排序
for(ull i=2;i<(1ULL<<16);i++){
ull cnt=0,lim=~0ULL;//~0ULL是2^64-1
while(lim>i){//推出最大幂次
lim/=i;
cnt++;
}
if(cnt<4)break;//小于4次幂直接退出
ull p=i*i*i;//这里三次幂下面再乘一次就变成4次了
for(ull j=4;j<=cnt;j++){
p*=i;
if(!mark[j]){//如果是合数次幂加入set
s.insert(p);
}
}
}
s.insert(1);//1是特殊情况,案例输出里面也告诉我们有1
set<ull>::iterator it;
for(it=s.begin();it!=s.end();it++){
cout<<*it<<endl;
}
return 0;
}