Given the number n, find the smallest positive integer which has exactly n divisors. It is guaranteed that for the given n the answer will not exceed 10^18.
Input
The first line of the input contains integer n (1 ≤ n ≤ 1000).
Output
Output the smallest positive integer with exactly n divisors.
题意:求一个最小的数x,其恰好有n个因子.
思路:因为每选择一个素数作为因子,因子个数都至少乘2,所以递归层数不超过10几层,直接dfs即可.
我是按照反素数的写法写的,因为这样可以保证因子尽量得多,更快的到达我们的目标因子数.
代码:
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 2e5+5;
ll n,ans;
int pri[1234],is_prime[1234];
void init()
{
int cnt = 0;
for(int i = 2;i<= 500;i++)
{
if(!is_prime[i])
{
pri[++cnt] = i;
for(int j = i*i;j<= 500;j+= i)
is_prime[j] = 1;
}
}
return ;
}
void dfs(int x,ll m,int sum,int limit)
{
if(sum> n) return ;
if(sum == n)
{
if(ans == 0)
ans = m;
else ans = min(ans,m);
return ;
}
for(int i = 1;i<= limit&&m<= 1000000000000000000;i++)
{
m*= 1ll*pri[x];
dfs(x+1,m,sum*(i+1),i);
}
return ;
}
int main()
{
init();
cin>>n;
dfs(1,1,1,100);
cout<<ans<<endl;
return 0;
}