Cod sursa(job #1939533)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 25 martie 2017 19:52:40
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

bool ok[1000005];
vector<long long> primes, dv;
long long t;

void ciur()
{
    for (int i = 4; i < 1000005; i += 2)
        ok[i] = 1;
    primes.push_back(2);
    for (int i = 3; i < 1000005; i += 2)
        if(!ok[i]){
            primes.push_back(i);
            for (int d = i + i; d < 1000005; d += i)
                ok[d] = 1;
        }
}

int main()
{
    ciur();
    ifstream fin ("pinex.in");
    ofstream fout ("pinex.out");
    fin >> t;
    while(t--){
        dv.clear();
        long long n, m, copy, sol = 0;
        fin >> n >> m;
        copy = m;
        for (unsigned i = 0; i < primes.size() && primes[i] <= copy; ++i){
            if(copy % primes[i] == 0){
                dv.push_back(primes[i]);
                while(copy % primes[i] == 0)
                    copy /= primes[i];
            }
            if(primes[i] > sqrt(copy) && copy > 1){
                dv.push_back(copy);
                copy = 1;
            }
        }
        long long log = (1<<(dv.size()-1));
        for (long long i = 1; i < (1<<dv.size()); ++i){
            long long prod = 1, nr = 0;
            for (long long j = 0; j < dv.size(); ++j)
                if((1<<j)&i){
                    prod *= dv[j];
                    ++nr;
                }
            if(nr%2 == 1)
                sol += n/prod;
            else sol -= n/prod;
        }
        fout << n-sol << "\n";
    }
    return 0;
}