UVa11752

11752 The Super Powers
We all know the Super Powers of this world and how they manage to get advantages in political warfare
or even in other sectors. But this is not a political platform and so we will talk about a different kind
of super powers — “The Super Power Numbers”. A positive number is said to be super power when it
is the power of at least two different positive integers. For example 64 is a super power as 64 = 82 and
64 = 43. You have to write a program that lists all super powers within 1 and 264 ?? 1 (inclusive).
Input
This program has no input.
Output
Print all the Super Power Numbers within 1 and 264 ?? 1. Each line contains a single super power
number and the numbers are printed in ascending order.
Note: Remember that there are no input for this problem. The sample output is only a partial solution.
Sample Input
Sample Output
1
16
64
81
256
512
...

题意:
       超级幂就是指一个数至少是两个不同正整数的幂。找出1~2^64-1的所有超级幂,按照升序输出。

分析:

注意到超级幂可以写成一个正整数的合数次幂。所以思路就是枚举一定范围的正整数的合数次幂。注意到整数的范围是Unsigned long long,所以需要事先计算出每一个底数所能枚举的极限幂次,这也很容易,只需要令lim=2^64-1,然后不断用某个底数去除lim就可以得到该底数的极限幂次。当然底数也只需要枚举有限个,当底数的3次幂大于了lim就停止枚举底数。

 1 #include<iostream>
 2 #include<set>
 3 #include<cstdio>
 4 using namespace std;
 5 typedef unsigned long long ull;
 6 int primes[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61};
 7 int vis[70];
 8 int main(){
 9     ull lim = ~0LL >> 1;//最大边界
10     set<ull> s;
11     for(int i = 0; i < 18; i++) vis[primes[i]] = 1;//标记素数
12     for (ull i = 2;; i++){//枚举底数
13         ull cnt = -1, x = lim;
14         while(x) //计算出最大的指数cnt
15             x /= i,cnt++;
16         if(cnt < 4) break;
17         ull b = i;
18         for (ull j = 2 ; j <= cnt ; j++){
19             b *= i;
20             if (!vis[j])//枚举指数,如果该指数是合数,就放入set
21                 s.insert(b);
22         }
23     }
24     s.insert(1);//1是一个特例,最后放入
25     set<ull>::iterator it;
26     for(it = s.begin() ; it != s.end() ; it++)
27         cout << *it << ‘\n‘;
28     return 0;
29 }

时间: 2024-10-10 17:19:45

UVa11752的相关文章

超级幂 UVa11752

1.题目描述:点击打开链接 2.解题思路:本题要求找出1~2^64-1之间所有的超级幂.根据题意,不难知道这样的数的幂次一定是一个合数.而最大的幂次肯定不超过64,因此只需要去除4~64之间所有的素数即可,而这些素数可以事先打表.接下来开始枚举底数和幂次.由于幂次最多只有不超过60个,每个幂次对应的底数不超过10^5个,因此时间复杂度可以承受. 但这里还有一个问题:如何知道枚举到哪个幂次就停止枚举呢?很简单,只需要实现从2^64-1开始,计算出以i为底数的最大幂次的边界cnt即可.当cnt<4时

uva 11752 The Super Powers(暴力)

题目:https://cn.vjudge.net/problem/UVA-11752 题解:这里只讨论处理越界的问题. 因为题目最上界是 264-1. 我们又是求次幂的. 所以当我们就可以知道 i 的时候的界限 limit = 264-1 / i.如果刚好前一个次幂是 limit,那么再乘一个 i 刚好等于 264-1,按照题意是符合的. 那么如果当前的 次幂 a 是大于 limit 的话,a*i 就一定越界(可以自己想一想为什么),这个时候就可以break了. 这一题用set 保存,因为set

《算法竞赛入门经典——训练指南》第二章题库

UVa特别题库 UVa网站专门为本书设立的分类题库配合,方便读者提交: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=442 注意,下面注有"extra"的习题并没有在书中出现,但在上面的特别题库中有,属于附加习题. 基础练习 (Basic Problems) UVa11388 GCD LCM UVa11889 Benefit UVa10943 How do y

[数]被数学淹没不知所措

啊假期结束了,可以休息一阵子了 UVA-10892 分解&选择 #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; bool isp[1000005]; int p[80005]; int f[100005]; int m,co; void pri() { co = 0; for (int i = 2; i < 10