#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
vector<int> minp, primes;//欧拉筛
void sieve(i64 n) {
minp.assign(n + 1, 0); primes.clear();
for (int i = 2; i <= n; i++) {
if (minp[i] == 0) { minp[i] = i, primes.push_back(i);}
for (auto p : primes) {
if (i * p > n) { break; }
minp[i * p] = p;
if (p == minp[i]) { break; }
}
}
}
int main () {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
sieve(1e6);
i64 n, cnt = 0; cin >> n;
int len = primes.size();
for (int i = 1; i < len; i++) {
for (int j = 0; j < i; j++) {
if (1LL * primes[j] * pow(primes[i], 3) > n) { break; }
cnt++;
}
}
cout << cnt;
}
int main () {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
sieve(1e6);
i64 n, cnt = 0; cin >> n;
int left = 0, right = primes.size() - 1;
while (left < right) {
if (1LL * primes[left] * pow(primes[right], 3) <= n) {
cnt += (right - left);
left++;
}
else {
right--;
}
}
cout << cnt;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
sieve(1e6);
i64 n, cnt = 0; cin >> n;
i64 len = primes.size();
for(int i = 0; i < len; i++) {
i64 x = n / pow(primes[i], 3) * 1LL;
cnt += upper_bound(primes.begin(), primes.begin() + i, x) - primes.begin();
}
cout << cnt;
return 0;
}