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;
}