/**
题目:The Super Powers UVA 11752
链接:https://vjudge.net/contest/154246#problem/Y
题意:求无符号长整形以内的数满足至少可以用两种不同的次方来表示。比如64 = 2^6 = 8^2; 一个数的1次方不算数。
思路:
分析过程如下:
1 = 1^1 1^2 1^3
16 = 2^4 4^2
64 = 2^6 8^2
81 = 3^4 9^2
256 = 2^8 16^2
512 = 2^9 8^3 设Max为最大的可能获得的值。
Max = a^e1 or a^e2 or ... (2<=e1<e2) a <= Max开三次方根=[1,1e7] 前面我猜想一个满足条件的数是某一个素因子的合数次方。 (2*3)^4 = (4*9)^2 含有多个素数。实际上不止一个素因子。 那么底数在(Max开三次方根)内是任意可能的。 有一点可以肯定:一个数的合数次方一定是满足条件的数。 底数在[1,1e7]以内。然后合数范围在64以内。然后set存数并去重;时间复杂度过大。 避免使用set?尝试提前去重。 2^4, 2^6, 2^8, 2^9, 2^10, 2^12, 2^14, 2^15. 取2^8 = 4^4 重复了。 2^12 = 4^6 = 8^4 (保证幂是合数) 重复了。 而:2^4, 2^6, 2^9, 2^10, 2^14, 2^15不会再重复。因为幂都是两个素数相乘的结果。 如何通过现在的某些计算来预测将来的某些数不用再重复计算?
或者通过一些计算来判定当前的数已经算过了。 4^4, 4^6, 4^8, 4^9, 4^10, 4^12. 好像这些都是重复了的。那么。。。所有的底数为合数都会被重复。 只要计算底数为素数的就行了? (2*3)^4 = (4*9)^2 含有多个素数。从哪里得来? 再试试其他合数为底数的情况。 6^4, 6^6, 6^5, 6^8, 6^9, 6^10. 6^4没有重复过。并不是所有的底数为合数都会被重复。 2^12 = 8^4 可以得知如果以前出现过。那么底数应该可以开根号才行,即底数可以表示成一个数的次方,次方>1。 新结论:底数如果是某个数的次方,那么它的所有合数幂都重复过。其他情况均没有重复过。 问题好像重复了。都是某个数的次方。只不过题目为至少两个。 那么对每一个非次方数的底数a。它的贡献为a^e. (e为合数,且a^e<=2^64 - 1) 还是往这方面处理:如何通过现在的某些计算来预测将来的某些数不用再重复计算? 预处理64以内的合数的约数对,即:两个约数相乘等于本身为一对。这样通过约束对来判断是否那些底数会重复。 当两个约数至少一个>=4的合数时候,比如d1,d2;那么(x^d1)^d2 or (x^d2)^d1 都要去重。 解题方法:
预处理64以内的约数。以及每一个约数的约数对。
枚举底数a在[1,1e7]内。
对每一个底数a枚举它约数次方。并如果次方可以分解成两个约数,其中一个是>=4的约数。那么底数^另一个约数形成的数不能再作为计算的底数。 猜想:如果时间超限,适当降低[1,1e7]右边界的范围。 为了避免底数的合数次方超出unsigned long long 范围,所以用log对数来处理。 其实应该可以很快想到的,但是走了很多弯路。积累经验。多思考。
*/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include<vector>
#include <cmath>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5+;
const double eps = 1e-;
vector<int> v[];//存储约数对。
int isHe[];//isHe[i] == 1表示这是一个合数。
int he[], z;//存储合数。
ull ans[], cnt;//注意这里不能和maxn一直相同。因为ans数量可能更多。
//经测试最多67385个;
int flag[maxn];
ll f(ll a,ll b)
{
ll p = ;
while(b){
if(b&) p*=a;
a = a*a;
b >>= ;
}
return p;
}
void init()
{
memset(isHe, , sizeof isHe);
for(int i = ; i < ; i++){
if(isHe[i]==){
for(int j = i*i; j < ; j+=i){
isHe[j] = ;
}
}
}
z = ;
for(int i = ; i < ; i++){
if(isHe[i]){
he[z++] = i;
for(int j = ; j*j < ; j++){
if(i%j==){
if(he[j]||he[i/j]){
v[i].push_back(j);
v[i].push_back(i/j);
}
}
}
}
}
ull mas = (<<)-;
//cout<<"mas = "<<mas<<endl;
cnt = ;
for(int i = ; i < maxn; i++){
if(flag[i]) continue;
ull p = i, num = ;
for(int j = ; j < z; j++){
if(he[j]>log(mas)/log(i)-eps) break;///不加eps,会存在误差,比如2^64次方可能会算进去。然后p = 0;
while(num<he[j]){
num++;
p *= i;
}
if(num<he[j]) break;
ans[cnt++] = p;
int len = v[he[j]].size();
for(int k = ; k < len; k+=){
if(isHe[v[he[j]][k]]){
ull temp = f(i,v[he[j]][k+]);
if(temp>=maxn) continue;
flag[temp] = ;
}
if(isHe[v[he[j]][k+]]){
ull temp = f(i,v[he[j]][k]);
if(temp>=maxn) continue;
flag[temp] = ;
}
}
}
}
sort(ans,ans+cnt);
printf("1\n");
for(int i = ; i < cnt; i++){
printf("%llu\n",ans[i]);
}
}
int main()
{
init(); return ;
}

The Super Powers UVA 11752 分析分析 求无符号长整形以内的数满足至少可以用两种不同的次方来表示。比如64 = 2^6 = 8^2; 一个数的1次方不算数。的更多相关文章

  1. The Super Powers UVA - 11752

    题目大意:将范围从1~pow(2,64)-1内的super power输出.super power的定义:一个数x至少存在两种x=pow(i,k),(k!=1). 题解: 注意数据范围2的64次方-1 ...

  2. The Super Powers UVA - 11752(合数幂)

    题意: 求1~2^64-1之间所有的 至少是两个不同的正整数的幂的数  升序输出 一个数的合数次幂即为这样的数 找出1~2^64-1中所有数的合数次幂 用set存起来(既能防止重复 又能升序) 最后输 ...

  3. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  4. 【google面试题】求1到n的正数中1出现的次数的两种思路及其复杂度分析

    问题描写叙述: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.比如输入12,从1到12这些整数中包括1 的数字有1.10.11和12.1一共出现了5次. 这是一道广为流传的googl ...

  5. 求GCD(最大公约数)的两种方式

    求GCD(最大公约数)的两种方式 这篇随笔讲解C++语言程序设计与应用中求GCD(最大公约数,下文使用GCD代替)的两种常用方式:更相减损法和辗转相除法,前提要求是具有小学数学的基本素养,知道GCD是 ...

  6. uva 11752 The Super Powers 素数+大数判断大小

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  7. python基础练习题(题目 求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制)

    day11 --------------------------------------------------------------- 实例018:复读机相加 题目 求s=a+aa+aaa+aaa ...

  8. 2014 Super Training #8 G Grouping --Tarjan求强连通分量

    原题:ZOJ 3795 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3795 题目大意:给定一个有向图,要求把点分为k个集 ...

  9. 创建TabHost的两种方式的简单分析

    最近做了一个TabHost的界面,在做的过程中发现了一些问题,故和大家分享一下. 首先我的界面如下: 目前就我所知,创建TabHost有两种方式,第一种是继承TabActivity类,然后用getTa ...

随机推荐

  1. 51单片机软件I2C驱动中的CY

    做一个MSP430的项目,虽然430内部有硬件I2C的模块,略难,准备直接移植51的..碰到一句代码 dat <<= 1; //移出数据的最高位 pSDA = CY; //送数据口 dig ...

  2. Android Studio 生成aar包多Module引用问题

    问题描述: 有个arr文件被放到Module A中引用,现在Module B又依赖了Module A,则在编译过程中会发生错误,Module B找不到aar文件. 解决办法: 使用相对路径来找到这个a ...

  3. 常见的 HTTP 状态代码及原因

    代码 说明 备注 200 确定 IIS 7.0.IIS 7.5 和 IIS 8.0 成功处理了请求. 304 未修改 客户端浏览器请求已处于缓存中的文档,并且自从该文档被缓存后,未修改此文档.客户端浏 ...

  4. windbg --sqlserver 实例 转

    http://blog.csdn.net/obuntu/article/details/5962378 SQLSERVER DUMP 调试 在下面的对话框输入 ~ 会出现线程的信息 0:000> ...

  5. 快速开发框架(FDMS)新增1000个对外接口都不须要手写一行代码

    一个大型系统难免会跟其它系统有数据交换,这里就要提供数据接口给外部系统. 曾经在一家智能终端设备的公司上班.那段时间的主要工作就是写接口.接口须要与手机.手持设备.系统管理软件等进行数据交换.总结了一 ...

  6. python——PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...

  7. Linux——Ubuntu下Sublime Text 2的安装

    Sublime Text 2是一款共享软件,收费但可以永久免费试用的编辑器,价格是59个美刀,相信开发者一定不了解中国人,也不面对中国市场,.言归正传,ST2编辑功能强大,好评如潮,在Windows/ ...

  8. JavaScriptl 类数组转换为数组

    slice和Array.form方法,具体见示例代码: <!DOCTYPE html> <html lang="zh"> <head> < ...

  9. 删除LINUX更新后多余的内核

    删除LINUX更新后多余的内核 本人使用的时fredoa 21 之前为了搞网卡驱动不知不觉升级了几次系统,每次启动后都有好几个内核让我选,真的非常头疼阿,尤其像博主这样的有点强迫的人,看着就心烦,所以 ...

  10. MATLAB 的通用命令

    MATLAB 的通用命令 1.MATLAB 的标点符号及其特殊功能. 2.MATLAB 的键盘按键及其特殊功能. ↑或者Ctrl+p:调用上一次的命令 ↓或者Ctrl+n:调用下一行的命令 ←或者Ct ...