题意:给一个n,求最小的正整数,其因子个数为n。
思路:暴搜求反素数。
反素数的性质:
1.一个反素数的质因子必然是从2开始连续的质数。
2.
e
m
i
r
p
=
p
1
t
1
×
p
2
t
2
×
.
.
.
×
p
m
t
m
,
p
1
≥
p
2
≥
.
.
.
≥
p
m
emirp=p_1^{t_1} \times p_2^{t_2} \times ... \times p_m^{t_m},p_1 \ge p_2 \ge ... \ge p_m
emirp=p1t1×p2t2×...×pmtm,p1≥p2≥...≥pm 。
#include<bits/stdc++.h>
#define ll unsigned long long
#define ms(x,a) memset(x,a,sizeof(x))
#define linf 0x3f3f3f3f3f3f3f3f
//#define debug
using namespace std;
const int maxn = 1e3 + 10;
bool v[maxn];
int cnt;
ll p[maxn];
void sieve() {
ms(v,0);
ms(p,0);
cnt = 0;
v[1] = 1;
for(int i = 2; i < maxn; ++i) {
if(!v[i]) {
p[++cnt] = i;
}
for(int j = 1; j <= cnt && i * p[j] < maxn; ++j) {
v[i * p[j]] = 1;
if(i % p[j] == 0)break;
}
}
}
ll n, ans,up = 1e18;
void dfs(ll cur, ll cnt, ll depth, ll l) {
if (depth > 20) return;
if (n == cnt) {
ans = min(ans, cur);
}
for (int i = 1; i <= l; i++) {
if(cur * p[depth] > up){
break;
}
cur *= p[depth];
dfs(cur, cnt * (i + 1), depth + 1, i);
}
}
void solve() {
sieve();
scanf("%lld",&n);
ans = linf;
#ifdef debug
cout<<ans<<endl;
#endif
dfs(1, 1, 1, 1000);
printf("%lld\n",(long long)ans);
}
int main() {
solve();
return 0;
}