2813: [HNOI2001]求正整数 D1 T2
今天转载一个,希望原作者可以同意哈
题目描述
对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m。
例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6;而且是最小的有4个因子的整数。
输入
输入一个整数n(1≤n≤50000)
输出
输出一个整数m
样例输入
4
样例输出
6
今天做OJ时遇到的题目,没有人提交,也没有人做对
所以~~~我上网搜了,搜到了一位大佬——我要吃熊猫
我二话不说,直接复制,没想到。。。竟然对了!!!
太激动了!!!
分享一下大佬的代码(我作了些修改)
#include<bits/stdc++.h>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
int n;
int ans[50005],get[18],tmp[18];
int pri[18]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
double mn=DBL_MAX,lg[18];
inline void mul()
{
int i,j;
ans[0]=ans[1]=1;
fo(i,1,16)
while(get[i]--)
{
fo(j,1,ans[0]) ans[j]*=pri[i];
fo(j,1,ans[0]) ans[j+1]+=ans[j]/10,ans[j]%=10;
ans[0]++;
while(ans[ans[0]])
ans[ans[0]+1]+=ans[ans[0]]/10,ans[ans[0]]%=10,ans[0]++;
while(!ans[ans[0]]) ans[0]--;
}
}
inline void dfs(double x,int y,int z)
{
int i,j;
if(x>=mn) return;
if(y==1)
{
mn=x;
memset(get,0,sizeof get);
fo(i,1,z-1) get[i]=tmp[i];
return;
}
if(z>16) return;
for(i=0;(i+1)*(i+1)<=y;i++)
if(y%(i+1)==0)
{
if(i) tmp[z]=i,dfs(x+lg[z]*i,y/(i+1),z+1); //pri[z]^i
if((i+1)*(i+1)!=y)
{
tmp[z]=y/(i+1)-1;
dfs(x+lg[z]*(y/(i+1)-1),i+1,z+1);
}
}
}
int main()
{
int i,j;
scanf("%d",&n);
fo(i,1,16) lg[i]=log(pri[i]);
dfs(0,n,1);
mul();
for(i=ans[0];i>=1;i--) printf("%d",ans[i]);
return 0;
}
浙公网安备 33010602011771号