博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA11752 The Super Powers —— 数论、枚举技巧
阅读量:5095 次
发布时间:2019-06-13

本文共 1317 字,大约阅读时间需要 4 分钟。

题目链接:

 

 

题意:

一个超级数是能够至少能表示为两个数的幂,求1~2^64-1内的超级数。

 

题解:

1.可知对于 n = a^b,如果b是合数,那么n同样可以表示为: n = (a^k)^c,其中k*c = b。所以只需要枚举底数,然后再枚举指数,如果指数为合数,那么它就是一个超级数。

2.由于2^64-1已经是 unsigned LL 的最大值了,为了避免溢出,指数应该从当前底数能达到的最大指数开始枚举。

3.由于一个超级数可能被多次访问到,所以用STL的 set 可以解决重复、离散化的问题,而且还能排序。

 

代码如下:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #define ms(a,b) memset((a),(b),sizeof((a)))13 using namespace std;14 typedef long long LL;15 const int INF = 2e9;16 const LL LNF = 9e18;17 const int mod = 1e9+7;18 const int maxn = 1e5+100;19 20 int vis[100];21 void init()22 {23 int m = sqrt(64+0.5);24 for(int i = 2; i<=m; i++) if(!vis[i]) {25 for(int j = i*i; j<64; j += i)26 vis[j] = 1;27 }28 }29 30 typedef unsigned long long ull;31 set
s; //用set完成了排序加去重的功能32 int main()33 {34 init(); //标记在64以为的合数35 for(ull i = 2;; i++) //枚举底数36 {37 int t = ceil(64*log(2)/log(i)) - 1;38 if(t<4) break;39 ull x = 1;40 for(int j = 1; j<=t; j++)41 {42 x *= i;43 if(vis[j]) s.insert(x);44 }45 }46 47 s.insert(1);48 set
::iterator it;49 for(it = s.begin(); it!=s.end(); it++)50 cout<<*it<
View Code

 

转载于:https://www.cnblogs.com/DOLFAMINGO/p/8391584.html

你可能感兴趣的文章
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
asp.net 获取IP地理位置的几个主要接口
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
设计模式之装饰者模式
查看>>
【转】Linux内核调试方法总结
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
ORACLE 递归查询
查看>>
[Android] 开发第十天
查看>>
操作~拷贝clone()
查看>>
Java开发中的23种设计模式
查看>>
jQuery源码分析(2) - 为什么不用new jQuery而是用$()
查看>>
[转]【EL表达式】11个内置对象(用的少) & EL执行表达式
查看>>
ArrayList对象声明& arrayList.size()
查看>>