题意:
求最小的约数个数为n的数
解题思路:
反素数经典问题。这题要求的就是反素数,因为反素数的质因子一定是连续的,所以可以dfs枚举在连续几个质因子上的个数,即枚举种t1,t2,t3,每一个素因子的幂,来算出当前的数的因子个数,对于等于n的我们更新一下答案,使答案更小即可。
更形象一点的还是看acdreamers的博客吧,看到搜索树的图就很好理解了。
代码:
#include <bits/stdc++.h>
using namespace std;
const unsigned long long inf=~0ULL;
int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int n;
unsigned long long ans;
void dfs(int dept, unsigned long long tmp, int num)
{
if(num>n)return;
if(num==n){ans=min(tmp, ans);return;}
for(int i=0; i<=63; i++)
{
if(inf/p[dept]<tmp)break;
dfs(dept+1, tmp*=p[dept], num*(i+2));
}
return;
}
int main()
{
cin>>n;
ans=inf;
dfs(0, 1, 1);
cout<<ans<<endl;
}