Cod sursa(job #2024971)

Utilizator PaulStighiStiegelbauer Paul-Alexandru PaulStighi Data 21 septembrie 2017 18:20:05
Problema Principiul includerii si excluderii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");

const int NMax = 1 << 18;

bool Prim[NMax + 5];
int X[64];
int A,B,M,N,P,Sol;

vector <int> Div;

void Sieve()
{
    for(int i = 2 ; i <= NMax ; ++i)
    {
        if(!Prim[i])
            for(int j = 2 * i ; j <= NMax ; j += i)
                Prim[j] = 1;
    }
}

void Back(int k)
{
    for(int i = X[k-1] + 1 ; i <= N ; ++i)
    {
        X[k] = i;

        P *= Div[X[k] - 1];

        if(k % 2)   Sol += A / P;
        else    Sol -= A / P;

        if(k < N)   Back(k + 1);

        P /= Div[X[k] - 1];
    }
}

void Solve()
{
    fin >> M;

    while(M--)
    {
        fin >> A >> B;

        for(int i = 2 ; i <= B / 2 ; ++i)
            if(!Prim[i] && !(B % i))
                Div.push_back(i);

        if(!Prim[B])    Div.push_back(B);

        N = Div.size(); P = 1; Sol = 0;

        Back(1);

        fout << A - Sol << "\n";

        Div.clear();
    }
}

int main()
{
    Sieve();
    Solve();

    fin.close();
    fout.close();
    return 0;
}