题意:传送门
题解:首先,要考虑
1
N
1~N
1 N中最大的反质数,就是
1
N
1~N
1 N中约数个数最多的数中最小的一个。
这点是必然的,其次,在
1
N
1~N
1 N任何数的不同质因子都不会超过
10
10
10个,且所有质因子的指数总和都不会超过
30
30
30,最小的11个质数的乘积
2
∗
3
∗
5
∗
7
∗
11
∗
13
∗
17
∗
19
∗
23
∗
29
∗
31
>
2
∗
1
0
9
2*3*5*7*11*13*17*19*23*29*31>2*10^{9}
2∗3∗5∗7∗11∗13∗17∗19∗23∗29∗31>2∗109,所以
N
N
N中的任何一个数都不可能有多于
10
10
10个不同的质因子。即使只包含最小的质数,仍然是
2
31
>
2
∗
1
0
9
2^{31}>2*10^9
231>2∗109,所以指数总和不可能超过30。最后,
x
x
x的质因子是连续的若干个最小的质数,并且指数非严格单调递减。因为首先不连续的话,可以将后面大的质因子转为前面某个不存在的质因子以及它的指数,对于指数非严格单调递减,也是可以将后面指数大的与前面指数小的互相调换答案不是更优,所以可以直接调用搜索来做。
c
o
d
e
:
code:
code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,ps[]={2,3,5,7,11,13,17,19,23,29,31},minx,sum;
void dfs(int u,int last,int p,int s)
{
if(s>sum||s==sum&&p<minx){
minx=p;sum=s;
}
for(int i=1;i<=last;i++){
if((ll)p*ps[u]>n)break;
p*=ps[u];
dfs(u+1,i,p,s*(i+1));
}
}
int main()
{
cin>>n;
dfs(0,30,1,1);
cout<<minx<<endl;
return 0;
}