namespace prime { int phi[maxn][maxm]; int p[maxn], pi[maxn * 10], cnt; bool vis[maxn * 10];
inlinevoidinit() { for (int i = 2; i < maxn * 10; ++i) { if (!vis[i]) p[++cnt] = i; pi[i] = cnt; for (int j = 1; j <= cnt && i * p[j] < maxn * 10; ++j) { vis[i * p[j]] = 1; if (i % p[j] == 0) break; } }
for (int n = 0; n < maxm; ++n) for (int m = 0; m < maxn; ++m) if (!n) phi[m][n] = m; else phi[m][n] = phi[m][n - 1] - phi[m / p[n]][n - 1]; }
inline ll Phi(ll m, int n) { if (n == 0) return m; elseif (p[n] >= m) return1; elseif (m < maxn && n < maxm) return phi[m][n]; returnPhi(m, n - 1) - Phi(m / p[n], n - 1); }
inline ll Pi(ll m) { if (m < maxn) return pi[m]; int s = sqrt(m + 0.9), y = cbrt(m + 0.9), n = pi[y]; ll res = Phi(m, n) + n - 1; for (int i = n + 1; p[i] <= s; ++i) res -= Pi(m / p[i]) - Pi(p[i]) + 1; return res; } }