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

性质
  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为例):
    CF27E Number With The Given Amount Of Divisors_第1张图片
    可以看出从根节点到每一个叶子结点这条路径上的所有数字乘起来都是12的约数,所以12有6个约数。

坑点

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

代码实现

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

你可能感兴趣的:(刷题)