【HNOI2001】洛谷3184 求正整数

115 篇文章 0 订阅
76 篇文章 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");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值