Description
对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m。例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6;而且是最小的有4个因子的整数。
Input
n(1≤n≤50000)
Output
m
Sample Input
4
Sample Output
6
贴个链接。。
感觉对数那里用的很好,学到新东西了
#include<cstdio>
#include<cmath>
#include<iostream>
#include<iostream>
#include<cfloat>
#include<cstring>
using namespace std;
int n;
int pri[]={
0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int lalal[20],shen[20];
double mx=DBL_MAX,lg[21];
int ans[100005];
void print ()
{ans[0]=ans[1]=1;for (int u=1;u<=16;u++){for (;lalal[u]>0;lalal[u]--){for (int j=1;j<=ans[0];j++)ans[j]*=pri[u];for (int j=1;j<=ans[0];j++)ans[j+1]+=(ans[j]/10),ans[j]%=10;if (ans[ans[0]+1]!=0)ans[0]++;while (ans[ans[0]]/10!=0)ans[ans[0]+1]+=(ans[ans[0]]/10),ans[ans[0]++]%=10;}}for (int u=ans[0];u>=1;u--)printf("%d",ans[u]);printf("\n");
}
void dfs (double x,int y,int z)//现在的数是e^x 还剩下y个因子 选到第z个质数
{if (x>=mx) return ;if (y==1){memset(lalal,0,sizeof(lalal));mx=x;for (int u=1;u<z;u++)lalal[u]=shen[u];return ;}if (z>16) return ;for (int u=0;(u+1)*(u+1)<=y;u++){if (y%(u+1)==0){shen[z]=u;dfs(x+lg[z]*u,y/(u+1),z+1);if ((u+1)*(u+1)!=y){shen[z]=y/(u+1)-1;dfs(x+lg[z]*(y/(u+1)-1),u+1,z+1);}}}
}
int main()
{scanf("%d",&n);for (int u=1;u<=16;u++)lg[u]=log(pri[u]);dfs(0,n,1);print();return 0;
}