Cod sursa(job #1997147)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 3 iulie 2017 15:20:05
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

void findPrimes(int aux, std::vector<long long> &primes, std::vector<long long> &found) {
    found = std::vector<long long>();
    for (int prime : primes) {
        if (!(aux % prime)) {
            found.push_back(prime);
        }
        if (prime > aux) {
            break;
        }
    }
}

void comp(int a, std::vector<long long> &primes, long long &sum, long long div, int nCount, int ind) {
    if (nCount > 0) {
        sum += pow(-1, nCount - 1) * (a / div);
    }
    for (int i(ind); i < primes.size(); i++) {
        comp(a, primes, sum, div * primes[i], nCount + 1, i + 1);
    }
}

int main() {
    std::ifstream fileIn("pinex.in");
    std::ofstream fileOut("pinex.out");

    std::vector<long long> primes;
    std::vector<bool> ciur(1000000 + 1, true);
    ciur[2] = true;
    for (int i(2); i <= 1000000; i++) {
        if (!ciur[i]) {
            continue;
        }
        primes.push_back(i);
        for (int j(i + i); j <= 1000000; j += i) {
            ciur[j] = false;
        }
    }

    ciur.clear();

    long long nO, a, b;
    long long sum;

    fileIn >> nO;

    std::vector<long long> found;
    for (; nO; nO--) {
        fileIn >> a >> b;
        sum = 0;
        findPrimes(b, primes, found);
        comp(a, found, sum, 1, 0, 0);
        fileOut << a - sum << '\n';
    }

    fileIn.close();
    fileOut.close();
    return 0;
}