题目大意

对于任何正整数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. bootstrap 网格布局

    一:基本的网格布局 <div class="container"> <div class="row"> <div class=&q ...

  2. android.system.ErrnoException: open failed: ENOENT (No such file or directory) 07-19 20:27:45.011 66

    在操作安卓版本23+的文件读取时,不仅要在maniests中声明,还要在代码中动态声明: ; private static String[] PERMISSIONS_STORAGE = { Manif ...

  3. mysqlslap对mysql进行压力测试

    mysqlslap是从5.1.4版开始的一个MySQL官方提供的压力测试工具.通过模拟多个并发客户端访问MySQL来执行压力测试,并且能很好的对比多个存储引擎在相同环境下的并发压力性能差别. mysq ...

  4. postgreSQL中跨库查询在windows下的实现方法

    以下是在postgreSQL 8.1版本中的实践,其他版本类似: 1.将C:\Program Files\PostgreSQL\8.1\share\contrib下的dblink.sql复制到C:\P ...

  5. php header() 函数用法归纳

    301 永久重定向 <?php header('HTTP/1.1 301 Moved Permanently'); header('Location: http://www.example.co ...

  6. spring3+quartz2

    听说来自这里www.ydyrx.com 转载的: 最近公司要用定时任务,自己想着学习并完成任务,百度,google,360,必应,能用的搜索都用了,参差不齐,搞了一整天,也没找到一个好的例子.没办法, ...

  7. eas之kdtable分组

    如何指定是否要进行数据分组以及对哪些列进行分组 // 指定KDTable要进行数据分组 table.getGroupManager().setGroup(true); // 指明要对0.1.2三列进行 ...

  8. java实现根据高德地图API接口进行地址位置解析,将地址转化为经纬度

    原创文章,转载请注明,欢迎评论和更改. 1,所需额外ar包,import net.sf.json.JSONObject; 2,完整源代码代码 package com.travel.util; impo ...

  9. 21.实验基于_version进行乐观锁并发控制

    21.实验基于_version进行乐观锁并发控制 主要知识点: 实验基于_version进行乐观锁并发控制 1.实验实战演练基于_version进行乐观锁并发控制 (1)先构造一条数据出来 PUT / ...

  10. 项目部署到tomcat出错(tomcat运行时的JDK版本)

    先展示一下错误,把项目部署到tomcat运行 出错原因 简单来说,就是执行代码的jdk版本 低于 编译的jdk版本 最后面的52.0是一种叫什么魔码,有各自对应的jdk版本. 其中52.0 对应的就是 ...