一看到约数个数就可以很快想到约数个数定理
然后就是反推,枚举约数
注意需要高精,但搜索过程高精会T,所以利用对数运算对乘和次方降级
如 2^3*3*5 → log(2^3*3*5) = 3*log(2)+log(3)+log(5)
码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,i,j,cnt,lin[19],daan[9999],da[9999],jw,k;
double lg[19],ans=9999999999999;
int su[19]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
void dfs(int ys,double o,int dqwz)
{ int i;
if(o>ans)return;
if(ys==1||dqwz==17)
{
if(o<ans)
{
ans=o;
for(i=1;i<=dqwz-1;i++)
daan[i]=lin[i]-1;
}
return;
}
for(i=lin[dqwz-1];i>=2;i--)
{
if(ys%i==0)
{
lin[dqwz]=i;
double oo=i;
dfs(ys/i, o+(oo-1)*lg[dqwz] ,dqwz+1);
}
}
}
int main()
{
scanf("%d",&n);
for(i=1;i<=16;i++)
lg[i]=log(su[i]);
lin[0]=n;
dfs(n,0,1);
da[0]=1;
da[1]=1;
for(i=1;i<=16;i++)
for(j=1;j<=daan[i];j++)
{
jw=0;
for(k=1;k<=da[0];k++)
{
int lin=jw;
jw=(da[k]*su[i]+jw)/10;
da[k]=(da[k]*su[i]+lin)%10;
}
while(jw)da[++da[0]]=jw%10,jw/=10;
}
for(i=da[0];i>=1;i--)
printf("%d",da[i]);
}