CF27E Number With The Given Amount Of Divisors

CF27E Number With The Given Amount Of Divisors


技术统计

难度 提高+/省选-

用时 30min

提交次数 5

unaccept 次数 4

ac次数 1


题意概括

给定一个正整数n,输出最小的整数,满足这个整数有n个因子

数据范围

n ≤ 1000 n\le 1000 n1000



解法、

知识点

  1. dfs
  2. 反素数
  3. 数学QwQ

解法概括

首先我们明确一个问题:反素数

定义:

对于任意的正整数n,我们设f(n)为其因数的个数,若存在任意的i(0<i<n)都有f(i)<f(n),那么我们称n为一个反素数

性质
  1. 对于任意的反素数,其质因子必然是从2开始的连续质数
  2. 对于任意的反素数n,若 n = 2 t 1 × 3 t 2 × 7 t 7 × 1 1 t 2 × . . . . . . n=2^{t_1} \times 3^{t_2} \times 7^{t_7} \times 11^{t_2} \times...... n=2t1×3t2×7t7×11t2×......
    那么,必然有 t 1 ≥ t 2 ≥ t 3 ≥ . . . . . . {t_1} \ge {t_2} \ge {t_3} \ge...... t1t2t3......
    我们将 2 , 3 , 5 , 7...... 2,3,5,7...... 2,3,5,7......为一层建立一棵树(以n=12为例):
    在这里插入图片描述
    可以看出从根节点到每一个叶子结点这条路径上的所有数字乘起来都是12的约数,所以12有6个约数。

坑点

codeforces上用 l l d lld lld好像是不行的,应该用 I 64 d I64d I64d

代码实现

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
int n;
ll ans,rec[10010],prime[10]={2,3,5,7,11,13,17,19,23,29};
void dfs(int a,int b,ll temp)
{
    if(temp<ans&&a==n)ans=temp ;
    if(a>=n)return ;
    for(int i=1;i<=64;i++)
    {
        if(temp>ans/prime[b])break;
        temp*=prime[b];
        dfs(a*(i+1),b+1,temp);
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        ans=1e18+2;
        dfs(1,0,1);
        printf("%I64d\n",ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值