目录
显示
题目链接
https://www.luogu.org/problem/P1463
题解
设 \(\{p_i\}\) 为递增排列的质数序列,将数 \(x\) 进行质因数分解:
$$x=\prod_{i=1}^{+\infty} p_i^{k_i}$$
当 \(p_i\) 递增的时候,\(k_i\) 只有递减才可能成为反质数(假如存在 \(i>j\),且 \(k_i<k_j\) 的情况,可以交换两个 \(k\),就可以在因数个数不变的情况下让数字变小)。
因此可以按这个规律进行搜索。
#include <iostream>
#include <algorithm>
using namespace std;
const int p[]={0,2,3,5,7,11,13,17,19,23,29,31,37};
int t[15],n;
long long ans,maxd;
void dfs(long long num,int cur,int d)
{
if(cur>=13)return;
if(d>maxd)ans=num,maxd=d;
else if(d==maxd)ans=min(ans,num);
long long tmp=num;
for(int i=0;i<=t[cur-1]&&tmp<=n;i++,tmp*=p[cur])
{
t[cur]=i;
dfs(tmp,cur+1,d*(i+1));
}
}
int main()
{
cin>>n;
t[0]=50;
dfs(1,1,1);
cout<<ans<<endl;
return 0;
}