链接: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;
}