bzoj1225: [HNOI2001] 求正整数

来源:互联网 发布:10月外贸数据 编辑:程序博客网 时间:2024/06/04 19:53

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;}
原创粉丝点击