题目链接

题目描述

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。

如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

现在给定一个数N,你能求出不超过N的最大的反质数么?

题目分析

根据反质数的概念和算术基本定理,我们可以知道,若x为反质数,则x=∏piai(pi为质数,pi>pi-1,ai<=ai-1)(对于最后一项限制的说明:若存在ai>ai-1,则交换ai与ai-1所得的数与原来的数因数个数相等,但比原来的数小,故原数非反质数)。

这样,我们只需要从小到大枚举质数,对于每一个质数枚举它的指数进行搜索,判断生成的数是否是满足条件的最大反质数即可,注意如果当前生成的数因数个数与记录的最大因数个数相等,但数本身比记录值小,需要更新记录值,因为原来的数已经不是反质数了。

对于枚举质数的范围,因为2×3×5×7×11×13×17×19×23×29大于N的最大值,故只需枚举这几个质数即可。同时,由于231也已经大于N的最大值,所以指数的上界为31。

代码

 #include<cstdio>
using namespace std;
const int prime[]={,,,,,,,,,,};
unsigned long long n,max_factor,ans;
void dfs(unsigned long long step,unsigned long long sum,unsigned long long factor,unsigned long long maxn)
{
if(step>||sum>n)
return;
if(max_factor<factor)
{
max_factor=factor;
ans=sum;
}
else if(max_factor==factor&&ans>sum)
ans=sum;
unsigned long long t=;
for(unsigned long long i=;i<=maxn;++i)
{
t*=prime[step];
dfs(step+,sum*t,factor*(i+),i);
}
return;
}
int main()
{
scanf("%llu",&n);
dfs(,,,);
printf("%llu",ans);
return ;
}

反素数

最新文章

  1. CSS篇
  2. IOS开发札记
  3. tomcat启动异常(严重: Dispatcher initialization failed Unable to load configuration. - [unknown location] )
  4. java 笔试题 字符串旋转
  5. C++学习基础六——复制构造函数和赋值操作符
  6. Xperf Basics: Recording a Trace(转)
  7. .NET通过调用Office组件导出Word文档
  8. Ibatis 后台打印完整的sql语句
  9. android 联系数据库
  10. IE11仿真文档模式默认IE5 IE7的调整办法
  11. python paramiko ssh登录交换机执行命令
  12. python_6
  13. C语言与C++语言的强制类型转换格式区别
  14. python制作模块
  15. 微信小程序顶部(navigationBar)设置为透明
  16. JAVA(三)JAVA常用类库/JAVA IO
  17. youku视频
  18. 【Java面试题】20 运行时异常和一般异常有何区别
  19. 20155209 2016-2017-2《Java程序设计》课程总结
  20. MongoDB基本用法

热门文章

  1. css3颜色+透明度渐变
  2. centos7 创建sftp
  3. Xcode崩溃日志分析工具symbolicatecrash用法
  4. 记springboot + MP +Hikari动态数据源配置
  5. MySQL基础篇(03):系统和自定义函数总结,触发器使用详解
  6. Spring Cloud的核心成员、以及架构实现详细介绍
  7. [工具] Git版本管理(知识总结)
  8. 【题解】[HNOI2015]菜肴制作(贪心+topo序)
  9. &lt;算法&gt;&lt;go实现&gt;左括号补全-双栈法
  10. 1086 就不告诉你 (15分)C语言