#pragma once

#include <vector>

// находит все простые числа от 0 до n
namespace alg
{
  inline std::vector<int> find_primes(int n)
  {
    std::vector<int> r;
    std::vector<bool> is_prime(n + 1, true);

    // 0 и 1 не являются простыми числами
    is_prime[0] = is_prime[1] = false;

    // Исключаем все чётные числа, кроме 2
    for (int i = 4; i <= n; i += 2) is_prime[i] = false;

    // Перебираем только нечётные числа, начиная с 3
    for (int p = 3; p * p <= n; p += 2) 
      if (is_prime[p]) 
        for (int i = p * p; i <= n; i += 2 * p) is_prime[i] = false;

    for (int p = 3; p <= n; p += 2) 
      if (is_prime[p]) r.push_back(p);

    return r;
  }
}

