题目链接
https://www.lydsy.com/JudgeOnline/problem.php?id=1053
分析
由反素数的定义可知,该数一定是不超过 N N N 的数中,约数个数最多的数中最小的。
考虑将该数质因数分解,要保证不超过 2 × 1 0 9 2 \times 10 ^ 9 2×109,则其质因数个数不超过 10 10 10;
同时要在约数个数相同的情况下最小,肯定是最多用到前 10 10 10 个质数,且其指数不增。
在以上限制条件下,搜索质数的指数即可。
AC代码
#include <cstdio>
inline int read() {
int num = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return num;
}
const int maxn = 15, maxt = 35;
const int prime[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
int n, p[maxn][maxt], ans, maxc;
void dfs(int now, int mul, int last, int cnt) {
if (now == 10) {
if (cnt > maxc || (cnt == maxc && ans > mul)) ans = mul, maxc = cnt;
return;
}
for (int i = 0; i <= last; ++i)
if (p[now][i] && 1ll * mul * p[now][i] <= n)
dfs(now + 1, mul * p[now][i], i, cnt * (i + 1));
}
int main() {
n = read();
for (int i = 0; i < 10; ++i) {
p[i][0] = 1;
for (int j = 1; j <= 30; ++j)
if (1ll * p[i][j - 1] * prime[i] <= n)
p[i][j] = p[i][j - 1] * prime[i];
}
dfs(0, 1, 30, 1);
printf("%d", ans);
return 0;
}