反素数ant(数学题)
2023-12-05 17:22:03
1053: [HAOI2007]反素数ant
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2872 Solved: 1639
[Submit][Status][Discuss]
Description
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0<i<x
,则称x为反质数。例如,整数1,2,4,6等都是反质数。现在给定一个数N,你能求出不超过N的最大的反质数么
?
Input
一个数N(1<=N<=2,000,000,000)。
Output
不超过N的最大的反质数。
Sample Input
1000
Sample Output
840
//这个数学题有意思,本来求约数个数,就是一个数的质数个数乘啊乘的,不难,
举个例子,60 = 2*2*3*5 根据排列组合,约数个数就是 3*2*2=12 (2 可以有 0,1,2 三种选择,同理 3 有 0,1 两种选择,5 也是 2 种)
但是求范围内的最大的反质数,数据太大,循环太慢,
就只能逆向思维一下了,用质数去组合
质数必定会连续,因为不连续 一定有更小的数约数个数与这个数相等,例如 a = 2*3*7 , b = 2*3*5 约数个数相同,但 a 更大 ,所以 a 一定不是 反质数
懂了就简单了
0ms
#include <stdio.h>
typedef long long LL; const int p[]={,,,,,,,,,,,};//全部有一个就大于20E这个数据范围了
LL n,ans,m_yue; void dfs(int dep,LL num,LL yue)
{
if (dep>=) return;
if (yue>m_yue)
{
ans=num;
m_yue=yue;
//printf("??? %lld\n",ans);
}
if (m_yue==yue&&num<ans) ans=num;
for (int i=;i<=;i++)//i 代表多少次方
{
if (num*p[dep]>n) break;
dfs(dep+,num*=p[dep],yue*(i+));
}
} int main()
{
scanf("%lld",&n);
ans=,m_yue=;
dfs(,,);//深度,数字,约数个数
printf("%lld\n",ans);
return ;
}
最新文章
- 菜鸟学Struts2——零配置(Convention )
- 集合List内容
- oracle 密码过期处理
- JS-offsetParent定位父节点
- Windows 8.1 安装Ruby on Rails手记
- Match:Oulipo(POJ 3461)
- POJ2104 &; 主席还是可持久化还是 函数式
- 数据库表被锁表,select会等待。
- Red and Black ---路线问题
- (转)linux查看CPU性能及工作状态的指令mpstat,vmstat,iostat,sar,top
- 经典SQL练习题
- 第七章:Python基础のXML操作和面向对象(一)
- crontab语法
- JavaScript 获取鼠标点击位置坐标
- 文字描边css
- Python zip() 处理多于两个序列的参数, 存储结对的值
- MATLAB 简明教程
- ubuntu mysql主从库的搭建
- 使用GCD创建单例
- 【OpenCV】SIFT原理与源码分析