>Link
luogu P1463
>Description
1
≤
n
≤
1
0
9
1≤n≤10^9
1≤n≤109
>解题思路
题目大意:求在 [ 1 , n ] [1,n] [1,n]内的一个数,这个数的约数最多且尽可能小
我们知道
x
x
x可以表示为
x
=
∏
p
i
k
i
x=\prod p_i^{k_i}
x=∏piki,
p
i
p_i
pi都为质数
那
x
x
x的约数个数为
g
(
x
)
=
∏
(
k
i
+
1
)
g(x)=\prod (k_i+1)
g(x)=∏(ki+1)
对于所有的 p i p_i pi( k i k_i ki可以为0),观察一下发现,如果有 k i < k j k_i<k_j ki<kj,并且 p i < p j p_i<p_j pi<pj,那为了使得最终乘起来的数尽可能小,更优的是使得 k i k_i ki 和 k j k_j kj 的数值调换(约数个数仍然是不变的),这样对应的 x x x 当然更小
综上,
x
x
x的表达式
x
=
∏
p
i
k
i
x=\prod p_i^{k_i}
x=∏piki,一定是
∀
p
i
<
p
j
,
k
i
≥
k
j
\forall p_i<p_j,k_i≥k_j
∀pi<pj,ki≥kj
所以我们爆搜就行了
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
const LL p[100] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
int T, ans2;
LL n, ans1;
LL read()
{
LL ret = 0;
char cc = getchar();
while (cc < '0' || cc > '9') cc = getchar();
while (cc >= '0' && cc <= '9')
{
ret = ret * 10 + cc - '0';
cc = getchar();
}
return ret;
}
void dfs (int now, int cnt, LL k, int sum)
{
if (sum > ans2) ans1 = k, ans2 = sum;
else if (sum == ans2 && k < ans1) ans1 = k;
for (int i = 1; i <= cnt; i++)
{
k *= p[now];
if (k > n) break;
dfs (now + 1, i, k, sum * (i + 1));
}
}
int main()
{
ans1 = ans2 = 0;
n = read();
dfs (1, 64, 1, 1);
printf ("%lld", ans1);
return 0;
}