Pagini recente » Cod sursa (job #1256339) | Cod sursa (job #1454659) | Cod sursa (job #1409982) | Cod sursa (job #1520476) | Cod sursa (job #1551878)
// 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;
}