本次,学到了反素数相关知识,也更深地了解了DFS递归搜索。
以不同素数来进行分层搜索,指数用来每层可以选择的。
#include<iostream>
using namespace std;
long long prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,39,41,43};
long long ans;long long maxmi;long long n;
void dfs(long long x,long long mi,long long k,long long limit)
{
if(k==15)return; //k代表层,也代表第K+1个素数
if(x>n)return;
if(mi>maxmi) // 每次大于则更新
{
maxmi=mi;
ans=x;
}
if(mi==maxmi) // 相等时时候,取小的
{
if(x<ans)
ans=x;
}
for(int i=1;i<=limit;i++) // limit是对指数的限制最后2^50次,并用下面的I传递来保证递减性!
{
x*=prime[k];
if(x>n)return; //此处不忘跳出。
mi*=(i+1);
dfs(x,mi,k+1,i);
mi=mi/(i+1); //同层的要变回。
}
}
int main()
{
while(cin>>n)
{
ans=0;maxmi=0;
dfs(1,1,0,50);
cout<<ans<<endl;
}
return 0;
}