题目描述

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

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

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

输入输出格式

输入格式:

一个数N(1<=N<=2,000,000,000)。

输出格式:

不超过N的最大的反质数。

输入样例#1:

1000
输出样例#1:

840

这道题很明显要找到的是不大于n的约数数最多的数里面最小的
因为如果约数相同而另一个数比你小就不满足题意了
我们可以把一个数拆成一堆质因数的幂的和 S=2^x1+3^x2+...+p^xn(p仍旧为质数)
方案总数就是cnt=(x1+1)*(x2+1)*(x3+1)*…… 这个自己想想就知道了的
而我们只需要找前9个质数就好了因为前9个质数2*3*5*7*11*13*17*19*23*29=6,469,693,230>2,000,000,000
这样情况其实很少我们只需要来一次爆搜解决问题就好了哇
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int num[]={,,,,,,,,,,,,};
int n,ans,mx;
void dfs(LL now,LL sum,int step){
if(now>mx) mx=now,ans=sum;
if(now==mx&&ans>sum) ans=sum;
for(int i=;i<=;i++){
if(sum*num[step]>n) break;
sum=sum*num[step];
dfs(now*(i+),sum,step+);
}
}
int main()
{
n=read();
ans=;
dfs(,,);
printf("%d\n",ans);
return ;
}

最新文章

  1. AIR ANE(本机扩展)使用中的一些问题(Android平台)
  2. WPF ListView 排序
  3. 命令行查看linux发行版版本信息
  4. EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页
  5. httpclient模拟浏览器get\post
  6. spring事物的传播行为
  7. YouTube CEO关于工作和生活平衡的完美回答
  8. 4.当接口的请求方式为 application/json的时候时
  9. python_嵌套列表变成普通列表
  10. 移动端 transitionEnd函数用来检测过渡是否完成
  11. Linux(4)系统管理
  12. C# linq对分组操作执行子查询
  13. [最直白版]一步一步教你用VMware Workstation12安装Ubuntu 16.04和VMware Tools的教程
  14. js 生成随机炫彩背景
  15. mysql中find_in_set的使用
  16. C++ MySQL编程
  17. Python日志模块logging&amp;JSON
  18. leetcode1026
  19. 第二阶段——个人工作总结DAY04
  20. JAVA 第二周学习总结

热门文章

  1. php面向对象(2)值传递
  2. JavaScript通过HTML的class来获取HTML元素的方法总结
  3. 无序数组中第K大的数
  4. sed命令例子详解
  5. Samba和NFS文件共享
  6. Linux下单机安装部署kafka及代码实现
  7. 亲手搭建一个基于Asp.Net WebApi的项目基础框架2
  8. PJMEID学习之视频的捕捉与播放
  9. UIView和CALayer是什么关系?
  10. python3 打印九九乘法口诀表