题干:
小希希望你构造一个最小的正整数,使得其有n个因子。
输入描述:
第一行一个整数T表示数据组数每组数据第一行输入一个正整数n,表示其因子数。n≤1,000,000n≤1,000,000T≤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;
}