题目大意是在1~2^64-1的范围内找到所有符合条件的数,条件要求这个数字是两个或两个以上不同数字的幂,例如64=8^2=4^3。

对于这一题,分析是:如果一个满足这个条件的数字一定可以转换成i^k,而且k是一个合数。同时,幂指数的上限在1~64中,这一点是通过观察筛选数字的范围

所得出的。综上,幂指数k的限定条件是(1<=k<=64,k为合数)。那么在正式筛选数字前可以通过素数筛选从而来标记出1~64中所有的合数,而对于每一种情况的幂指数就是ceil(log(2^64)/log(i))=ceil(64*(log(2)/log(i)))。

接下来需要限定的是底数的范围。我们的筛选范围的最大值也就是2^64-1,而幂指数的最小值为4,所以底数的最大值为2^16-1。则底数的范围就是1~2^16-1.

ps:2^16=1<<16;

剩下的事情就是枚举所有可能的情况,值得一提的是这里用到STL中的set可以节省很多的代码,因为set的特性就是里面的数据不重复而且是按从小到大的顺序排列的。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <set>
#include <string>
#include <iterator>
#include <algorithm>
typedef unsigned long long LL;
using namespace std;
int index[100]={ 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26,
27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45, 46,
48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64};
set<LL> ans;
int main()
{
LL maxt=1<<16,i;
LL temp;
int maxindex,j;
ans.clear();
printf("1\n");
for(i=2;i<maxt;i++)
{
temp=i*i*i*i;
ans.insert(temp);
maxindex=ceil(64*(log(2)/log(i)))-1;//计算每数的幂指数的最大值
for(j=1;index[j]<=maxindex;j++)//筛选出每个数的幂中符合要求的数
{
if(index[j]-index[j-1]==1)
temp=temp*i;
else
temp=temp*i*i;
ans.insert(temp);
}
}
for(set<LL>::iterator iter=ans.begin();iter!=ans.end();iter++)
cout<<*iter<<endl;//这题用printf输出会出现数据丢失而且笔者未能找到有效的解决办法,若有人找到了请回复笔者怎么解决,感激不尽,此处建议用cout输出。
return 0;
}

数论 UVA 11752的更多相关文章

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

    /** 题目:The Super Powers UVA 11752 链接:https://vjudge.net/contest/154246#problem/Y 题意:求无符号长整形以内的数满足至少可 ...

  2. uva 11752 The Super Powers (数论+枚举)

    题意:找出1~2^64-1中 能写成至少两个数的幂形式的数,再按顺序输出 分析:只有幂是合数的数才是符合要求的.而幂不会超过64,预处理出64以内的合数. 因为最小的合数是4,所以枚举的上限是2的16 ...

  3. 数论 UVA 10780

    数论题目.有关内容:整数质因数分解,N的阶乘质因数分解,整除的判断. 这道题的题意是给你两个数n.m,要求你求出n!所能整除的m^k的最大值的k是多少. 由于数据范围:1<m<5000,1 ...

  4. 数论 UVA 10943

    这是一道关于组合数和隔板法的数论题目.题目说的是选出k个不同且不大于N的数字进行相加,要求这些数字之和等于N,结果要求输出这样的数有多少组.这里可以将问题利用隔板法来转换,那么题目的叙述可以转换成:这 ...

  5. 数论 UVA 11889

    有关数论的题目,题目大意是给你两个数a和c,c为a和另一个数b的最小公倍数,要求你求出b的最小值.由最大公约数gcd(a,b)和最小公倍数lcm(a,b)之间的关系可知,lcm(a,b)*gcd(a, ...

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

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

  7. 数论 UVA 10791

    这道题目是关于满足同意最小公倍数的所有数对中两数之和的最小值. 题目大意是给你一个数n,要求你求出在所有以n为最小公倍数的数对中两数之和的最小值. 方法:将n进行质因数分解,再将所有分解出的质因子加起 ...

  8. 数论 UVA 11076

    这道题目的意思简单易懂说的是给你n个数(可能有重复相同的数字),列出他们所有排列的情况,再逐位相加,求出和,例如:给你1,2,3,则排列的情况为<123>, <132>, &l ...

  9. 数论 UVA 11388

    这道题是关于两个数的最大公约数和最小公倍数的题目.给你两个数字g,l,分别表示最大公约数和最小公倍数.要求你找到两个数a,b,要求这两个数的最大公约数和最小公倍数为所给的两个数.如果存在多组数字符合这 ...

随机推荐

  1. linux命令:mkdir命令

    命令参数: -m, --mode=模式,设定权限<模式> (类似 chmod),而不是 rwxrwxrwx 减 umask -p, --parents  可以是一个路径名称.此时若路径中的 ...

  2. Less入门到上手——前端开发利器<一>

    摘录less官网的解释: LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. ...

  3. GIT warning: LF will be replaced by CRLF.

    git config --global core.autocrlf false git config --global core.autocrlf false  

  4. GPRS模块上电后复位会导致开机函数不正常的问题原因及解决方法

    之前使用的开机函数 void Gprs_modem_start_up(){GPIO_SetBits(GPIOB,GPIO_Pin_0); //RESET 脚要置成高电平,防止重启do{ GPIO_Se ...

  5. c c++怎么判断一个字符串中是否含有汉字

    c c++怎么判断一个字符串中是否含有汉字 (2013-02-05 10:44:23) 转载▼     #include  #include  int main() { char sztext[] = ...

  6. poj1192 最优连通子集(树形dp)

    题目链接:poj1192 最优连通子集 求一棵无向树的最大子树和..类似于求最大子段和的办法,树形dp. dp[i][0]:以i为根,不包括 i 结点的子树最大权 dp[i][1]:以i为根,包括 i ...

  7. 【必备】史上最全的浏览器 CSS & JS Hack 手册(转)

    浏览器渲染页面的方式各不相同,甚至同一浏览器的不同版本(“杰出代表”是 IE)也有差异.因此,浏览器兼容成为前端开发人员的必备技能.如果有一份浏览器 Hack 手册,那查询起来就方便多了.这篇文章就向 ...

  8. win7任务栏只显示日期不显示年月日

    某一天突然发现笔记本任务栏上的时间显示只剩下了时间,没有了年月日 于是百度 搜到的结果大多是如何设置显示的格式  yyyy-MM-dd 继续搜 终于搜到了正确答案 结果令我瞠目结舌  着实无奈 是因为 ...

  9. CodeForces #367 div2 D Trie

    题目链接:Vasiliy's Multiset 题意:这里有一个set容器,有三种操作,+ num, - num, ? num,分别代表往容器里加上num,或者拿走num,或着从容器里找一个数temp ...

  10. yii2.0高级框架配置时打开init.bat秒退的解决方法 (两种方法)

    第一种: 这几天刚接触到yii2.0框架,在配置advanced版本时运行init.bat初始化文件时老是闪退: 用cmd运行该文件时显示:The OpenSSL PHP extension is r ...