#include struct linear_sieve { explicit linear_sieve(int n) : lpf(n + 1) { for (auto i = 2; i <= n; ++i) { if (lpf[i] == 0) { lpf[i] = i; primes.push_back(i); } for (auto p : primes) { if (lpf[i] < p || n < 1LL * i * p) { break; } lpf[i * p] = p; } } } std::map factorize(int x) const { // O(log x) assert(1 <= x && x < int(lpf.size())); std::map f; while (1 < x) { ++f[lpf[x]]; x /= lpf[x]; } return f; } bool is_prime(int x) const { // O(1) assert(1 <= x && x < int(lpf.size())); return lpf[x] == x; } std::vector lpf; std::vector primes; }; int main() { std::cin.tie(0)->sync_with_stdio(0); int N, K; std::cin >> N >> K; linear_sieve sieve(N); auto ans = 0; for (auto i = 2; i <= N; ++i) { if (K <= int(sieve.factorize(i).size())) { ans += 1; } } std::cout << ans << "\n"; }