当前位置: 代码迷 >> 综合 >> 【HNOI2001】洛谷3184 求正整数
  详细解决方案

【HNOI2001】洛谷3184 求正整数

热度:31   发布时间:2024-01-13 11:21:05.0

题目描述

对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m。例如:n=4,则m=6,因为6有4个不同整数因子1,2,3,6;而且是最小的有4个因子的整数。
输入输出格式 输入格式:

n(1<=n<=50000)

输出格式:

m

对于m=a1^p1 * a2^p2 * … * an^pn,因数个数为(p1+1) * (p2+1) * … * (pn+1),所以只需要枚举每个因数的次数。又因为要求最小,所以从大到小质因数的个数一定单调不增。这样搜索就很快了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int mod=10000,maxl=3000;
struct big
{int a[maxl+10],l;bool operator < (const big & b) const{if (l!=b.l) return l<b.l;for (int i=l;i;i--)if (a[i]!=b.a[i])return a[i]<b.a[i];return 0;}big operator * (const int &x) const{big ret;ret.a[1]=0;for (int i=1;i<=l;i++){ret.a[i]+=a[i]*x%mod;ret.a[i+1]=a[i]*x/mod;}if (ret.a[l+1]) ret.l=l+1;else ret.l=l;return ret;}
}one,oo;
int n,prm[]={
   2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
big ans;
void dfs(int p,big x,int lim,int now)
{int i;if (ans<x) return;if (now==n){ans=x;return;}for (i=1,x=x*prm[p];i<=lim&&now*(i+1)<=n&&x<ans;i++,x=x*prm[p])dfs(p+1,x,i,now*(i+1));
}
int main()
{int i,j,k,p,q,x,y,z;scanf("%d",&n);oo.l=maxl;for (i=1;i<=maxl;i++)oo.a[i]=mod-1;one.l=one.a[1]=1;ans=oo;dfs(0,one,0x3f3f3f3f,1);printf("%d",ans.a[ans.l]);for (i=ans.l-1;i;i--){x=ans.a[i];if (x<1000) printf("0");if (x<100) printf("0");if (x<10) printf("0");printf("%d",x);}printf("\n");
}