uva11752 The Super Powers (数论+枚举) 详解

问题描述(机翻,能看懂就行)

我们都知道这个世界上的超级大国是如何在政治斗争中取得优势的
甚至在其他领域也是如此。但这不是一个政治平台,所以我们将讨论另一种
超级大国-“超级大国的数字”。一个正数被称为超级大国,当它
是至少两个不同正整数的幂。例如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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/91658993