#include using namespace std; const int CBRT = 3.5e7, MX = 3.6e7, OFFSET = 1e6; const long long MXN = 2.6e18; const double pi = acos(-1); int u[MX], M[MX]; vector primes; void precalc() { u[0] = M[0] = 0; u[1] = M[1] = 1; vector lp(MX, 0); for (int i = 2; i < MX; i++) { if (lp[i] == 0) { primes.push_back(i); lp[i] = i; u[i] = -1; } for (int p : primes) { if (p * i >= MX) break; lp[p * i] = p; if (lp[i] == p) break; u[p * i] = -1 * u[i]; } M[i] = M[i - 1] + u[i]; } } long long f(long long n) { static int dp[MXN / CBRT / CBRT]; long long res = 0; for (int d = 1; d < CBRT; d++) res += u[d] * (n / d / d); res -= M[CBRT - 1] * (n / CBRT / CBRT); int val = 0; while (CBRT * (val + 1ll) * CBRT <= n) val++; while (val > 0) { int x = sqrt(n / val); while (n / x / x < val) x--; while (n / (x + 1) / (x + 1) == val) x++; dp[val] = 1; int g = x / MX + 1, l = 2; for (int r; l < g; l = r + 1) { int v = x / l; r = x / v; dp[val] -= (r - l + 1) * dp[val * l * l]; } for (int r; l <= x; l = r + 1) { int v = x / l; r = x / v; dp[val] -= (r - l + 1) * M[v]; } res += dp[val]; val--; } return res; } int main() { precalc(); long long n; ignore = scanf("%lld", &n); long long x = max(n / (1 - 6 / (pi * pi)) - OFFSET, 0.0); n -= x - f(x); assert(n > 0); static long long a[2 * OFFSET]; iota(a, a + 2 * OFFSET, x + 1); for (int d : primes) { if (d * d * d > x + 2 * OFFSET) break; for (int i = d - (x % d) - 1; i < 2 * OFFSET; i += d) { int cnt = 0; while (a[i] > 0 && a[i] % d == 0) { a[i] /= d; cnt++; } if (cnt > 1) a[i] = 0; } } for (int i = 0; i < 2 * OFFSET; i++) { long long y = sqrt(a[i]); while (y * y > a[i]) y--; while ((y + 1) * (y + 1) <= a[i]) y++; if (y * y == a[i] && a[i] != 1) n--; if (n == 0) { printf("%lld\n", x + 1 + i); return 0; } } assert(false); return 0; }