当前位置: 代码迷 >> 综合 >> bzoj1225: [HNOI2001] 求正整数
  详细解决方案

bzoj1225: [HNOI2001] 求正整数

热度:21   发布时间:2023-10-29 10:41:37.0

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