题意
传送门 P1463 [POI2002][HAOI2007]反素数
题解
答案为 [ 1 , N ] [1,N] [1,N] 中约数个数最多的数中最小的一个。考虑数据范围内 x ∈ [ 1 , N ] x\in [1,N] x∈[1,N] 的约数个数,考虑最小的素数 2 2 2,则 x x x 的质因子指数不可能超过 30 30 30;考虑最小的连续素数,则 x x x 的质因数个数不可能超过 9 9 9。于是有了搜索范围的初步限制。
更进一步的, x x x 为反素数的必要条件是:将 x x x 分解质因数后可写作 2 e 1 × 3 e 2 … ( e 1 ≥ e 2 ⋯ ≥ 0 ) 2^{e1}\times 3^{e2}\dots(e1\geq e2\dots \geq 0) 2e1×3e2…(e1≥e2⋯≥0),即其质因子是连续的最小素数,且指数单调递减。由于相同指数的质因数对约数数量的贡献是一致的,那么在约数数量不变的情况下,对于其他的情况都可以找到更小的数字。
#include <bits/stdc++.h>
using namespace std;
const int p = 9;
int prime[p] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
int _cnt, _res, limit;
void dfs(int id, int pre, int n, int x)
{
if (id >= p)
return;
for (int i = 1; i <= pre; ++i)
{
if (x > limit / prime[id])
break;
x *= prime[id];
int cnt = n * (i + 1);
if (_cnt < cnt || (_cnt == cnt && _res > x))
_cnt = cnt, _res = x;
dfs(id + 1, i, cnt, x);
}
}
int main()
{
scanf("%d", &limit);
dfs(0, 30, 1, 1);
printf("%d\n", _res);
return 0;
}