题目大意

对于任何正整数x,其约数的个数记作g(x)。如果某个正整数x满足对任意的0<i<x,都有g(x)>g(i)
,则称x为反质数。现在给定一个数N,求出不超过N的最大的反质数。(N<=2*1e9)

总体思路

性质1

不超过N的最大的反质数x为不超过N的约数个数最多的数字中最小的数字(最小的数字保证了不存在一个比x小的数y使得g(x)==g(y))。

直接爆搜寻找x会超时,我们要想办法缩小数据范围。

定理(性质2的基础)

任何一个合数都会分解为若干个质数的整数幂的乘积所表示。

所有因数的个数为所有质数幂的次数加一的乘积。(证明:因数也是由质数的乘积所组成的,所以把质数的幂拆解成一个个质数,因数的个数就是那若干个质数的组合。因为一种质数如果次数为0也是一种情况,所以要加1)。

性质2

若x是约数最多的数字中最小的数字,则一个必要条件是用于表示它的若干个质数的整数幂的次数随质数大小的增加而递减(否则,如果存在质数p1<p2,其次数a1<a2,那么把a1,a2交换,因数的个数没变,但所得的积变小了,这与x是约数最多的数字中 最小的 数字相矛盾)。

因此,我们用Dfs枚举满足性质2的质数的整数幂的次数的排列方式,在所有的排列方式中选取最优值即可。因为有了一个必要条件,搜索的范围减小了,这可以使时间效率提高。

那么到底枚举多少个质数呢?

性质3.1

N<=2*1e9时,枚举的质数不超过10个。(因为前十一个质数的乘积已经超过2*1e9了)

质数的选择式连续的,证明与性质2相似。

性质3.2

每个质数幂的次数不超过31(2^31已经超过整数的范围了)。

深度搜索

所有的深度搜索都是在隐式图上进行的。每个结点有它的【值】,每个结点有它所连着的【边】。

  • 本题中【边】是下一个质数的【幂次】的可能选项,其边权为 ak【下一个质数】^【幂次】,
  • 节点的【值】是多元组:①当前处理的【数值】(所有质数幂的次数加一的乘积),②当前的【约数的个数】,③当前节点的深度(对应全局【质数数组】的下标),④每个节点根据性质2对边有一个限制,作为【剪枝】。
  • 【边】和【节点】的关系为:乘积。

对于【隐式图】而言,节点的构成是通过DFS各个参数来传递和表示的。

非常重要的是对【叶子】的判定,因为【解】空间是由【叶子】构成的。可以根据【树深度】,也可以根据【孩子】的数目来判定。

每一个节点的性质应当是它自己的性质,而不是什么别的节点的性质。节点应当有一定的独立性。因此,DFS时,尽量不要出现prev什么什么的字眼。

注意事项

  • 21不是质数。。。
  • DFS初值的timeLimit应当为31,而不是正无穷。否则,枚举的幂的次数就成了2*1e31,就超时了。
  • 凡是带有product(积)字眼的必须是long long,否则会越界。
#include <cstdio>
#include <cstring>
#include <cstdarg>
#include <cstdlib>
using namespace std; int MaxFactorCnt;
int AnsProduct;
long long N;
const int Primes[15] = { 1,2,3,5,7,11,13,17,19,23,29,31 }; void Dfs(int p, int factorCnt, int timeLimit, long long totProduct)
{
if (p == 12)
{
if (factorCnt > MaxFactorCnt)
{
MaxFactorCnt = factorCnt;
AnsProduct = totProduct;
}
else if (factorCnt == MaxFactorCnt && totProduct < AnsProduct)
{
AnsProduct = totProduct;
MaxFactorCnt = factorCnt;
}
return;
}
long long nextPower = 1;
for(int nextTime=0; nextTime<=timeLimit && totProduct*nextPower<=N; nextTime++)
{
Dfs(p + 1, factorCnt * (nextTime + 1), nextTime, totProduct*nextPower);
nextPower *= Primes[p+1];
}
} int main()
{
MaxFactorCnt = 1;
AnsProduct = 1;
scanf("%lld", &N);
Dfs(0, 1, 31, 1);
printf("%d\n", AnsProduct);
return 0;
}

  

BZOJ1053 反素数的更多相关文章

  1. 【BZOJ1053】 反素数ant

    BZOJ1053 反素数ant 我们先考虑唯一分解定理求出约数个数: \(x=a_1^{p_1}a_2^{p_2}a_3^{p_3}...a_k^{p_k}\) 然后\(num=\Pi_{i=1}^k ...

  2. 【bzoj1053】反素数

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

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

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

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

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

  5. 【BZOJ1053】[HAOI2007]反素数

    [BZOJ1053][HAOI2007]反素数 题面 bzoj 洛谷 题解 可以从反素数的定义看出小于等于\(x\)的最大反素数一定是约数个数最多且最小的那个 可以枚举所有的质因数来求反素数,但还是跑 ...

  6. 【BZOJ1053】[HAOI2007]反素数ant 暴力

    [BZOJ1053][HAOI2007]反素数ant Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) ...

  7. bzoj1053: [HAOI2007]反素数ant

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

  8. 约数 求反素数bzoj1053 bzoj1257

    //约数 /* 求n的正约数集合:试除法 复杂度:O(sqrt(n)) 原理:扫描[1,sqrt(N)],尝试d能否整除n,若能,则N/d也能 */ ],m=; ;i*i<=n;i++){ ){ ...

  9. BZOJ1053:反素数(数学)

    题目链接 对于任意的正整数\(x\),记其约数的个数为\(g(x)\).现在定义反素数:对于\(0<i<x\),都有\(g(x)>g(i)\),那么就称x为反素数. 现在给定一个数N ...

随机推荐

  1. 自学Python七 爬虫实战一

    此文承接上文,让我们写一个简简单单的爬虫,循序而渐进不是吗?此次进行的练习是爬取前5页什么值得买网站中的白菜价包邮信息.包括名称,价格,推荐人,时间. 我们所需要做的工作:1.确定URL并获得页面代码 ...

  2. DeltaFish 校园物资共享平台 第三次小组会议

    一.想法 娄雨禛: 网页底层开发转移到后端,快速建站,效率高. 可以依照模板进行仿制. 可以考虑只进行页面设计. 但是出现问题不会调试. 所以自己写源码,做出一个大致的样子. 二.上周进度汇报 齐天杨 ...

  3. php数据库增删改查

    首先建立一个数据库db_0808,将db_0808中表格student导入网页. CURD.php <!DOCTYPE html> <html lang="en" ...

  4. 【PostgreSQL-9.6.3】函数(2)--字符型函数

    在上一篇博文中我们交流了数值型函数,这篇我们将讨论PostgreSQL中的字符型函数. 1. reverse(string) reverse函数可以将string字符串的字母显示顺序颠倒. test= ...

  5. 如何写出高性能SQL语句(文章摘自web开发者)

    (声明:本文内容摘自web开发者,仅供收藏学习之用,如有侵权请作者联系博主,博主将在第一时间删除) 原文地址:http://www.admin10000.com/document/484.html 1 ...

  6. emlog通过pjax实现无刷新加载网页--完美解决cnzz统计和javascript失效问题

    想要更详细了解pjax,需要查看官网 或者看本站文章:jQuery.pjax.js:使用AJAX和pushState无刷新加载网页(官网教程中文翻译) 效果看本站,音乐无刷新播放,代码高亮和复制js加 ...

  7. JSP_内置对象_response

    response对象: response对象包含了相应客户请求的有关信息,但在JSP中很少直接用到它,它是HttpServletResponse类的实例.response对象具有页面作用域,即访问一个 ...

  8. 【ng-zorro-antd】加入in-memory-web-api插件后icon不显示

    在ng-zorro-antd框架下,根据angular的技术文档demo,加入in-memory-web-api后icon不显示 解决方案: 在app.module.ts中的imports:[]加入 ...

  9. Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  10. PHP共享内存

    如何使用 PHP shmop 创建和操作共享内存段,使用它们存储可供其他应用程序使用的数据. 1. 创建内存段 共享内存函数类似于文件操作函数,但无需处理一个流,您将处理一个共享内存访问 ID.第一个 ...