牛客 炫酷数字(约数定理,DFS)

链接:https://ac.nowcoder.com/acm/problem/22139
来源:牛客网
 

题目描述

小希希望你构造一个最小的正整数,使得其有n个因子。

输入描述:

第一行一个整数T表示数据组数

每组数据第一行输入一个正整数n,表示其因子数。

n≤1,000,000

T≤1,000,000

输出描述:

输出一行一个整数,表示你构造出的这个数。注意:你需要保证你构造的数≤1,000,000,如果在这个范围里面无法构造出一个正整数满足条件,请输出-1。

示例1

输入

复制

2
4
5

输出

复制

6
16

约数定理,一个数可以拆成质因子的次方相乘的形式,他的约数就是质因子的次方数+1相乘,所以这题

可以预处理一遍,将最大构造数范围内的数因子数求出来,再进行输出;

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
int p[20] = { 0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 51 };//素数
ll judge = 0;
int ans[100010];
const int INF = 0x3f3f3f3f;
const int MAX = 1000000;
void dfs(int pos, ll num, ll sum, int len)//pos 是枚举质因子,num是约数的个数,sum是当前的数字大小,len用来枚举质因子的次方数
{
    if (sum > MAX)
        return;
    if (sum < ans[num])
        ans[num] = sum;   //记录因子数对应的最小数字
    judge = max(num, judge);
    for (int i = 1; i <= len; i++)
    {
        ll res = pow(p[pos], i);
        if (sum > MAX / res)
            break;
        dfs(pos + 1, num*(i + 1), sum*res, i);
    }
}
int main(){
    memset(ans, INF, sizeof ans);
    int t;
    cin >> t;
    dfs(1, 1, 1, 30);
    //cout << judge << endl;
    while (t--)
    {
        int n;
        cin >> n;
        if (n >judge||n==0)  //若超过了构造范围内最多的约数
        {
            cout << "-1" << endl;
            continue;
        }
        if (ans[n] == INF) 若不能构造
        {
            cout << "-1" << endl;
            continue;
        }
        cout << ans[n] << endl;
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值