Cod sursa(job #1939484)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 25 martie 2017 19:20:59
Problema Principiul includerii si excluderii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <vector>

using namespace std;

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

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

long long cmmmc(long long x, long long y)
{
    long long sol = x * y;
    while(y){
        long long r = x%y;
        x = y;
        y = r;
    }
    return sol/x;
}

long long cmmmc(vector<long long> s)
{
    if(s.size() == 1)
        return s[0];
    if(s.size() == 2)
        return cmmmc(s[0], s[1]);
    long long sol = cmmmc(s[0], s[1]);
    for (int i = 2; i < s.size(); ++i)
        sol = cmmmc(s[i], sol);
    return sol;
}

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];
            }
        long long log = (1<<(dv.size()-1));
        for (long long i = 1; i < (1<<dv.size()); ++i){
            vector<long long> s;
            long long x = i;
            for (long long j = log, d = 0; j > 0; j /= 2, ++d)
                if(j <= x){
                    x -= j;
                    s.push_back(dv[d]);
                }
            if(s.size()%2==1)
                sol += (n/cmmmc(s));
            else sol -= (n/cmmmc(s));
        }
        fout << n-sol << "\n";
    }
    return 0;
}