//#define _GLIBCXX_DEBUG #include //#include #include using namespace __gnu_pbds; template using ordered_set = tree, rb_tree_tag, tree_order_statistics_node_update>; using namespace std; #define all(n) begin(n), end(n) const long long INF = INT_MAX / 2; typedef long long ll; typedef vector vint; typedef vector> vvint; typedef vector vll; typedef vector> vvll; typedef unsigned long long ull; template bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; } template bool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; } template vector make_v(size_t a) { return vector(a); } template auto make_v(size_t a, Ts... ts) { return vector(ts...))>(a, make_v(ts...)); } template typename enable_if::value == 0>::type fill_v(T &t, const V &v) { t = v; } template typename enable_if::value != 0>::type fill_v(T &t, const V &v) { for (auto &e : t) fill_v(e, v); } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector v(n + 1); iota(all(v), 0); for (ll i = 2; i * i <= n; i++) { ll k = i * i; while (k <= n) { for (int j = 0; j <= n; j += k) { if (v[j] % k == 0 && v[j] % (k * i * i) != 0) v[j] /= k; } k *= i * i; } } int ans = 0; for (int a = 1; a <= n; a++) { int s = v[a]; int k = (sqrt(n) / sqrt(s)) - 1; while (s * (k + 1) * (k + 1) <= n) { k++; } ans += k; } cout << ans << endl; return 0; }