#include using namespace std; #define endl "\n" #define int long long const int N = 2e9; int n; int primes[9] = {2, 3, 5, 7, 11, 13, 17, 19, 23}; // 枚举的质数前9位,足够了 int mc, mx; // 最大反素数的约数个数,最大反素数值 /* u:走到数组primes的第几位 last:前一个质数,我们取的指数是多少,当前位置取的质数的指数需要小于等于last tmx: 当前路线上取得的最大反素数 tmc: 当前路线上取得的约数个数 */ void dfs(int u, int last, int tmx, int tmc) { if (u == 9) { // 走完全程 // ① 当前路径中约数个数大于最大约数个数,需要替换 // ② 当前路径中的约数个数等于最大约数个数,但是,当前路径的数值更小,也需要替换 if (tmc > mc || (tmc == mc && tmx < mx)) mc = tmc, mx = tmx; return; } for (int i = 0; i <= last; i++) { // 幂次只能是小于等于前一个数的幂次 int k = pow(primes[u], i); if (k * tmx > n) break; // 如果取当前这个素数的i次方,乘到原来的最大值后,大于n,那么此路径不通 /* u+1:下一个素数位置 i: 当前u这个素数取了i次幂 tmx*k : 因为取了i次幂,所以,最大值变大了k倍 tmc*(i+1) : 根据约数个数公式,因为有了质数 primes[u]后,取了i次幂,那么约数和增加(i+1)倍 */ dfs(u + 1, i, tmx * k, tmc * (i + 1)); } } signed main() { cin >> n; dfs(0, 30, 1, 1); // 从最小的质数2出发,最大的幂次不超过30 // n的最小取值是1,也就是小于等于1的范围内,最小的反素数是1,而且,约数的个数也是1 cout << mx << endl; }