牛客寒假算法基础集训营5 炫酷数字 (暴力)

炫酷数字

链接:https://ac.nowcoder.com/acm/contest/331/G

题目描述

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

输入描述:

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

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

n1,000,000

T1,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\n",minn[n]);
53     }
54 }

猜你喜欢

转载自www.cnblogs.com/1013star/p/10372375.html
今日推荐