#ySybttg060301. 1625:【例 1】反素数 Antiprime
1625:【例 1】反素数 Antiprime
1625:【例 1】反素数 Antiprime
题目描述
如果一个大于等于 的正整数 ,满足所有小于 且大于等于 的所有正整数的约数个数都小于 的约数个数,则 是一个反素数。譬如:,它们都是反素数。
请你计算不大于 的最大反素数。
输入格式
一行一个正整数 。
输出格式
只包含一个整数,即不大于 的最大反素数。
样例
样例输入 #1
1000
样例输出 #1
840
样例解释 #1
- 反素数的定义:对于任意 ,,其中 表示 的约数个数。
- 在不超过 的范围内,最大的反素数是 。
- 验证: 的约数个数为 (因为 ,约数个数 $(3+1)(1+1)(1+1)(1+1)=4 \times 2 \times 2 \times 2=32$)。小于 的数中,约数个数最多的是 (有 个约数)等,都小于 。
数据范围
- 对于 的数据,;
- 对于 的数据,;
- 对于 的数据,。
时空限制
- 时间限制:1000 ms
- 内存限制:524288 KB
注意:反素数就是在一定范围内约数个数最多的数中最小的那个。因为如果 是反素数,那么对于所有 ,都有 ,这意味着 是第一个达到这个约数个数的数,即 是拥有该约数个数的最小数。因此,问题转化为:在不超过 的范围内,找到约数个数最多的数,如果有多个,取最小的那个(即反素数)。
由于 最大 ,直接枚举每个数求约数个数不可行。注意到一个数的约数个数由其质因数分解决定。设 ,则 。为了在不超过 的前提下使 最大,我们需要选择较小的质数(如 )且指数 递减(即 ),因为较小的质数贡献更大。可以使用 DFS 搜索,枚举每个质数的指数,生成所有可能的候选数,记录约数个数最多的最小数。由于质数乘积增长很快,搜索深度有限(前 个质数乘积已超过 ),可以剪枝。
算法步骤:
- 预处理前若干个质数(例如前 个质数:)。
- DFS 搜索,参数包括:当前质数下标、上一个质数的指数、当前乘积、当前约数个数。
- 限制:乘积不超过 ,指数非递增(即当前质数的指数不超过上一个质数的指数)。
- 如果当前约数个数大于记录的最大约数个数,或相等但当前乘积更小,则更新答案。
- 搜索所有可能组合。
最终答案即为所求。