链接:https://ac.nowcoder.com/acm/contest/331/G
来源:牛客网
题目描述
小希希望你构造一个最小的正整数,使得其有n个因子。
输入描述:
第一行一个整数T表示数据组数
每组数据第一行输入一个正整数n,表示其因子数。
n≤1,000,000
T≤1,000,000
输出描述:
输出一行一个整数,表示你构造出的这个数。注意:你需要保证你构造的数≤1,000,000,如果在这个范围里面无法构造出一个正整数满足条件,请输出-1。
示例1
输入
2
4
5输出
6
16
分析:
利用类似埃氏筛选的方法,取一个数 i ,那么 i , 2i , 3i , 4i … 都含有因子 i ,所以令他们的因子数+1。
因为 某数的因子 总小于等于 该数,所以通过这种方法就能得到前1.000,000个数的因子数。
以下代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int main()
{
int min_num[maxn],num[maxn]={0}; //min_num[n]记录因子数为 n的最小数
fill(min_num,min_num+maxn,INT_MAX); //num[i]记录 i的因子数
for(int i=1;i<=1000000;i++)
{
for(int j=i;j<=1000000;j+=i)
{ //j=i,2i,3i,4i...
num[j]++; //j都含有因子 i,所以 num[j]++
}
}
for(int i=1;i<=1000000;i++)
{ //再次从1遍历到1000000
if(min_num[num[i]]==INT_MAX) //这样得到的一定是最小数
min_num[num[i]]=i;
}
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
if(min_num[n]==INT_MAX)
printf("-1\n");
else
printf("%d\n",min_num[n]);
}
return 0;
}