炫酷数字
链接: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
这个题 用dfs超时,暴力竟然过了。。。。
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1e6+5;
7 int casen,n;
8 int prime[maxn],minn[maxn];
9 void getprime() {
10 prime[1] = 1;
11 for(int i=2;i<maxn;i++) {
12 if(prime[i] == 0) {
13 for(int j = i+i;j<maxn;j+=i)
14 prime[j] = 1;
15 }
16 }
17 }
18 int find(int x) {
19 if(prime[x]==0)
20 return 2;
21 int ans = 1;
22 for(int i=2;i*i<=x;i++) {
23 if(x%i==0) {
24 int cnt = 0;
25 while(x%i==0) {
26 x/=i;
27 cnt++;
28 }
29 ans*=(cnt+1);
30 }
31 }
32 if(x>1)
33 ans*=2;
34 return ans;
35 }
36 int main()
37 {
38 minn[1] = 1;
39 getprime();
40 for(int i=2;i<=1000000;i++) {
41 int tmp = find(i);
42 if(minn[tmp] == 0)
43 minn[tmp] = i;
44 }
45 scanf("%d",&casen);
46 while(casen--)
47 {
48 scanf("%d",&n);
49 if(minn[n]==0)
50 puts("-1");
51 else
52 printf("%d
",minn[n]);
53 }
54 }