因为前个素数乘积大于,也大于。所以反素数分解质因数后一定是在前个素数,而且指数不超过.一定在前个素数。
证明:如果有一个反素数质因数不在这个素数,那么一定有一个这个素数内的没有被用到,那么我们可以把这个反素数改一下(设为n),变成,那么这样约数个数相同,但是变完后这个数更小,不符合反素数的定义,所以这个数一定不是反素数,所以反素数分解质因数后一定是在前10个素数里面。
而且必须是指数不升的,这个根据前面那个交换指数也可以证明。
所以只需要搜索前10个素数的指数,然后判定即可,有前面三个判定条件以及它不能超过n,实际搜索量非常小。

#include <bits/stdc++.h>

#define ll long long
#define inf 0x3f3f3f3f
#define il inline

namespace io {

    #define in(a) a=read()
    #define out(a) write(a)
    #define outn(a) out(a),putchar('\n')

    #define I_int ll
    inline I_int read() {
        I_int x = 0 , f = 1 ; char c = getchar() ;
        while( c < '0' || c > '9' ) { if( c == '-' ) f = -1 ; c = getchar() ; }
        while( c >= '0' && c <= '9' ) { x = x * 10 + c - '0' ; c = getchar() ; }
        return x * f ;
    }
    char F[ 200 ] ;
    inline void write( I_int x ) {
        if( x == 0 ) { putchar( '0' ) ; return ; }
        I_int tmp = x > 0 ? x : -x ;
        if( x < 0 ) putchar( '-' ) ;
        int cnt = 0 ;
        while( tmp > 0 ) {
            F[ cnt ++ ] = tmp % 10 + '0' ;
            tmp /= 10 ;
        }
        while( cnt > 0 ) putchar( F[ -- cnt ] ) ;
    }
    #undef I_int

}
using namespace io ;

using namespace std ;

#define N 100010
ll p[11] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
int id, n = read();
ll ans;

ll power(ll a, int b) {
    ll ans = 1;
    while(b) {
        if(b & 1) ans = ans * a;
        a *= a; b >>= 1;
    }
    return ans;
}

void dfs(int x, int limit, ll sum, ll tot) {
    if(sum > n || sum <= 0) return;
    if(x == 11) {
        if(tot > id) {
            ans = sum;
            id = tot;
        } else if(tot == id) ans = min(ans, sum);
        return;
    }
    for(int j = limit; j >= 0; --j) {
        dfs(x + 1, j, 1ll * sum * power(p[x], j), 1ll * tot * (j + 1));
    }
}

int main() {
    dfs(1, 31, 1, 1);
    printf("%lld\n", ans);
}