题干:

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

输入描述:

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

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

n≤1,000,000n≤1,000,000

T≤1,000,000T≤1,000,000

输出描述:

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

示例1

输入

复制

2
4
5

输出

复制

6
16

解题报告:

   这题一眼反素数,,每次都查询会超时,打表后发现240以上都输出-1就行了。标程是筛了一下素数然后维护答案的,也可以。(用时分别是180ms和360ms)

这也告诉我们,1e6以内的数,因子个数最多240个左右,还可以证明,1e9以内的数,因子个数1e5以内,当个小结论、、

AC代码1:(反素数)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e6 + 5;
ll biao[55] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
ll ans[MAX];
ll minn = 1e18+5;
ll n;
void dfs(ll dep,ll tmp,ll cur) {
    if(cur > n) return ;
    if(cur==n) minn = min(tmp,minn);
    for(ll i = 1; i<=63; i++) {
        if(minn < tmp * biao[dep]) break;
        tmp = tmp * biao[dep];
        dfs(dep+1,tmp,cur*(i+1));
    }
}
int main()
{
    int t;
    cin>>t;
    memset(ans,-1,sizeof ans);
    for(n = 1; n<=250; n++) {
    	minn = 1e18+5;
    	dfs(0,1,1),ans[n] = minn;
	}
    while(t--) {
        scanf("%lld",&n);
        minn = 1e18+5;
        if(n > 241) printf("-1\n");
        else {
        	if(ans[n]>1000000) printf("-1\n");
       	 	else printf("%lld\n",ans[n]);    
		}   
    }
    return 0 ;
 }

AC代码2:(注意这里的MAX一定是1e6+1,,不能打表打大了,,不然不满足构造的数小于1e6这个条件、、)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 1e6 + 1;
int cnt[MAX], ans[MAX],n;
int main()
{
    memset(ans, -1, sizeof(ans));
    for(int i = 1; i < MAX; i++)
        for(int j = i; j < MAX; j += i)
            cnt[j]++;
    for(int i = 1; i < MAX; i++)
        if(ans[cnt[i]] == -1) ans[cnt[i]] = i; 
    int t;
    cin>>t;
    while(t--) {
        scanf("%d",&n);
        printf("%d\n",ans[n]);
    }
    return 0;
}