题目描述
给出n,求出不大于n的x,使得任意 0 < i < x 0 < i < x 0<i<x,i的约数个数小于x的约数个数
思路
当
x
=
P
1
C
1
∗
.
.
.
∗
P
n
C
n
x = P_1^{C_1} * ... * P_n^{C_n}
x=P1C1∗...∗PnCn时
它的约数个数为
(
C
1
+
1
)
∗
.
.
.
∗
(
C
n
+
1
)
(C_1 + 1) * ... * (C_n + 1)
(C1+1)∗...∗(Cn+1)(因为每个
P
i
P_i
Pi有
C
i
C_i
Ci个选择
所以可以DFS每个质因子的个数,暴力👍
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
const ll wh[9] = {0, 2, 3, 5, 7, 11, 13, 17, 19};
ll n, k, Maxx, Ans;
void DFS(ll now, ll mul, ll sum)
{
if(now > 8 || mul * wh[now] > n)
{
if(sum > Maxx || (sum == Maxx && mul < Ans))
{
Maxx = sum;
Ans = mul;
}
return;
}
ll num = 1;
for(ll i = 1; i <= 30; ++i)
{
num *= wh[now];
if(num * mul > n)break;
DFS(now + 1, mul * num, sum * (i + 1));
}
DFS(now + 1, mul, sum);
return;
}
int main()
{
scanf("%lld", &n);
DFS(1, 1, 1);
printf("%lld", Ans);
return 0;
}