Cod sursa(job #1551878)

Utilizator bolovMihail Balan bolov Data 16 decembrie 2015 20:09:42
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
// http://www.infoarena.ro/problema/fractii

#include <fstream>
#include <vector>

using BitSet = std::vector<bool>;

static auto get_primes(int n) -> BitSet {
  auto primes = BitSet(n, true);

  primes[0] = primes[1] = false;

  for (auto i = 2; i < n; ++i) {
    if (!primes[i])
      continue;

    for (auto j = i + i; j < n; j += i) {
      primes[j] = false;
    }
  }

  return primes;
}

static auto get_num_fractions(int n) -> int {
  auto const primes = get_primes(n + 1);

  auto dividers = BitSet(n + 1);

  // for fractions with 1;
  auto sum = 2 * n - 1;

  for (auto k = 2; k < n; ++k) {
    if (primes[k]) {
      sum += 2 * ((n - k) - (n - k) / k);
      continue;
    }

    dividers.assign(n + 1, false);

    for (auto p = 2; p < k; ++p) {
      if (!primes[p] || k % p)
        continue;

      for (auto i = k + p; i <= n; i += p)
        dividers[i] = true;
    }

    for (auto i = k + 1; i <= n; ++i) {
      if (!dividers[i])
        sum += 2;
    }
  }

  return sum;
}

auto main() -> int {
  auto primes = get_primes(20 + 1);

  std::ifstream fin{"fractii.in"};
  auto n = int{};
  fin >> n;
  fin.close();

  std::ofstream fout{"fractii.out"};
  fout << get_num_fractions(n);

  return 0;
}