//优化
#pragma GCC optimize(2)
//C
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//C++
#include<algorithm>
#include<iostream>
#include<istream>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<map>
#include<set>
//宏定义
constexpr auto N = 110;
constexpr auto M = 400;
//定义+命名空间
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1000000007;
const ll INF = 0x3f3f3f3f;
const int maxn = 1e8 + 5;
using namespace std;
//全局变量
int prime[10] = { 2,3,5,7,11,13,17,19,23,29 };
int maxfactor = 0, minp, n;
//函数区
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
void dfs(int t, int p, int factor, int last) {
if (factor > maxfactor || maxfactor == factor && p < minp) {
maxfactor = factor;
minp = p;
}
for (int i = 1; i <= last; i++) {
if ((ll)p * prime[t] > n) break;
p *= prime[t];
dfs(t + 1, p, factor * (i + 1), i);
}
}
//主函数
int main() {
cin >> n;
dfs(0, 1, 1, 30);
cout << minp << endl;
return 0;
}
//分割线---------------------------------QWQ
/*
已知 N ,求小于 N 的最大反素数?
对于任何正整数x
其约数的个数记作g(x)
例如g(1)=1、g(6)=4
如果某个正整数x满足:g(x) > g(i) 0 < i < x
则称x为反质数
例如,整数1,2,4,6等都是反质数
/// g(x) > g(i) 0 < i < x
根据题意就是找小于 N 的最大反素数
即在 1 - N 范围内找约数最多且数最小的数
约数个数怎么求 ?
正整数 N = p1^a1 * p2^a2 ... pk^ak;
约数个数 = (a1 +1) * (a2 + 1) ... (ak +1)
a1 >= a2 ... >= ak
dfs 暴搜
t 枚举到第几个质数
更新判断条件: factor > maxfactor
factor == maxfactor && p < minp
for(int i=1;i<=last;i++){
}
last 保存的是上一个质数的指数
这样就保证这一个质数的指数是小于等于上一层的质数指数
总结: 1, 变量含义:
t 枚举到第几个质数
prime[] 存储需要的质数
minp 更新最小的值
last 保存的是上一个质数的指数
p 枚举的每一种情况
*/