\([POI2002][HAOI2007]\)反素数

题目描述

对于任何正整数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

题解

很早就看了黄学长的博客hzwer,一直没抽出时间去写,今天有大佬留了这道题,才去补坑。

作为一个数论蒟蒻,也学了一些结论。

首先,

约数个数定理:一个数约数个数=所有(素因子的次数+1)的乘积

\[n=\prod_{i=1}^{k}p_i^{a^i}=p_1^{a^1}·p_2^{a^2}······p_k^{a^k}
\]

\[g(n)=\prod_{i=1}^{k}(a_i+1)=(a_1+1)·(a_2+1)······(a_k+1)
\]

\(g(n)\)即为\(n\)的约数个数。

举例说明:正整数378000共有多少个正约数?

\(378000=2^4·3^3·5^3·7^1\),所以正约数个数为$(4+1)×(3+1)×(3+1)×(1+1)=160 $个。

以上不懂可以去问度娘 百度百科

其次,要使小素数多才能更优(因为这样约数就多了),所以还有一个剪枝就是为了要使小素数多,指数的大小是不递增的,比如说我选\(2\)个\(2\)和\(3\)个\(3\)就不如\(3\)个\(2\)和\(2\)个\(3\)(根据约数个数定理,它们约数个数相同,但后者更小);

我们还可以计算得一个\(2000000000\)以内的数字不会有超过\(12\)个素因子(前\(12\)个素数\(1,2,3,5,7,11,13,17,19,23,29,31\)的乘积已经超过$2000000000 $)。

然后就直接爆搜就行了。

code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
#define R register
#define P 66
using namespace std;
ll n,max_i,max_g;
int prime[P],tot,vis[P],maxdep=11;
inline void get_prime(R int n){
for(R int i=2;i<=n;i++){
if(!vis[i])
prime[++tot]=i;
for(R int j=1;j<=tot&&i*prime[j]<=n;j++){
vis[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
inline void dfs(R int dep,R ll now,R ll cnt,R int last){
if(now>n)return;
if(dep==maxdep){
if(now>max_i&&cnt>max_g){
max_i=now;
max_g=cnt;
}
if(now<=max_i&&cnt>=max_g){
max_i=now;
max_g=cnt;
}
return;
}
ll tmp=1;
for(R int i=1;i<=last;i++){
dfs(dep+1,now*tmp,cnt*i,i);
tmp*=prime[dep];
if(now*tmp>n)break;
}
}
int main(){
get_prime(50);
scanf("%lld",&n);
dfs(1,1,1,20);
printf("%lld\n",max_i);
return 0;
}

【BZOJ1053】[HAOI2007]反素数 (搜索+数论)的更多相关文章

  1. BZOJ1053 [HAOI2007]反素数ant 数论

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1053 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正 ...

  2. bzoj1053: [HAOI2007]反素数ant

    51nod有一道类似的题...我至今仍然不会写暴搜!!! #include<cstdio> #include<cstring> #include<iostream> ...

  3. BZOJ1053 [HAOI2007]反素数 & BZOJ3085 反质数加强版SAPGAP

    BZOJ 1053 Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x ...

  4. Luogu P1463 [POI2002][HAOI2007]反素数【数论/dfs】By cellur925

    题目传送门 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1 ...

  5. [BZOJ1053] [HAOI2007] 反素数ant (搜索)

    Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数 ...

  6. BZOJ1053: [HAOI2007]反素数ant(爆搜)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4163  Solved: 2485[Submit][Status][Discuss] Descript ...

  7. bzoj千题计划296:bzoj1053: [HAOI2007]反素数ant

    http://www.lydsy.com/JudgeOnline/problem.php?id=1053 求n以内约数个数最多的数 #include<cstdio> using names ...

  8. 【BZOJ1053】[HAOI2007]反素数(搜索)

    [BZOJ1053][HAOI2007]反素数(搜索) 题面 BZOJ 洛谷 题解 大力猜一下用不了几个质因子,那么随便爆搜一下就好了. #include<iostream> #inclu ...

  9. bzoj 1053: [HAOI2007]反素数ant 搜索

    1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1497  Solved: 821[Submit][Sta ...

随机推荐

  1. 【原】Coursera—Andrew Ng机器学习—Week 4 习题—Neural Networks 神经网络

    [1] Answer:C [2] Answer:D 第二层要输出四个元素a1 a2 a3 a4.输入x有两个,加一个x0是三个.所以是4 * 3 [3] Answer:C [4] Answer:C [ ...

  2. 从SQL Server中清除msdb备份和恢复记录

    正如我在前面的技巧“您的数据库上次恢复是什么时候呢?”中提到的,SQL Server使msdb数据库内系统表中的备份和恢复记录保持激活状态.没有正常的维护,这些系统表将变得很大,从而导致对于msdb数 ...

  3. SSH连接Linux

    转载自百度经验 https://jingyan.baidu.com/article/bea41d439d16d7b4c51be619.html 连接Linux的工具有Putty.SSH Secure ...

  4. Angular23 loading组件、路由配置、子路由配置、路由懒加载配置

    1 需求 由于Angular是单页面的应用,所以在进行数据刷新是进行的局部刷新:在进行数据刷新时从浏览器发出请求到后台响应数据是有时间延迟的,所以在这段时间就需要进行遮罩处理来提示用户系统正在请求数据 ...

  5. 由于挂载的nfs存储目录掉下线,导致创建VM时,无法创建

    具体错误,如下截图 重新挂载存储后,在创建VM,将成功

  6. 9-python 的ProxyHandler处理器(代理设置)

    ProxyHandler处理器(代理设置) 使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的. 很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正 ...

  7. OpenCV的Rect矩形类用法

    转自 http://blog.csdn.net/kh1445291129/article/details/51149849 //如果创建一个Rect对象rect(100, 50, 50, 100),那 ...

  8. jq遍历table表demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 认识Session

    Session在不同环境下的不同含义 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session ...

  10. 第17章-Spring消息

    1 异步消息简介 像RMI和Hessian/Burlap这样的远程调用机制是同步的.如图17.1所示,当客户端调用远程方法时,客户端必须等到远程方法完成后,才能继续执行.即使远程方法不向客户端返回任何 ...