struct num { ll data[10005]; num operator * (const int b) const { num c; memcpy(c.data, data, sizeof(data)); for (int i = 1; i <= c.data[0]; i++) c.data[i] *= b; for (int i = 1; i <= c.data[0]; i++) { if (c.data[i] >= 10000) { c.data[i + 1] += c.data[i] / 10000; c.data[i] %= 10000; } } ll &h = c.data[0]; while (c.data[h + 1] > 0) { h++; c.data[h + 1] += c.data[h] / 10000; c.data[h] %= 10000; } return c; } void print() { printf("%lld", data[data[0]]); for (int i = data[0] - 1; i >= 1; i--) { if (data[i] <= 9) printf("000"); else if (data[i] <= 99) printf("00"); else if (data[i] <= 999) printf("0"); printf("%lld", data[i]); } } } ans;//高精乘
void dfs(int poi, int now, int last, double temp) { if (poi == 16 || temp > recv || n % now) return; if (now == n) { if (temp < recv) { recv = temp; memcpy(a, rec, sizeof(rec)); } return; } double t = val[poi]; int k = n / now; for (int i = min(k - 1, last); i >= 0; --i) { rec[poi] = i; dfs(poi + 1, now * (i + 1), i, temp + i * t); } rec[poi] = 0; }
int main() { scanf("%d", &n); for (int i = 0; i < 16; i++) val[i] = log(prime[i]); dfs(0, 1, n - 1, 0); ans.data[0] = ans.data[1] = 1; for (int i = 0; i < 16; i++) while (a[i]--) ans = ans * prime[i]; ans.print(); }