Cod sursa(job #2139658)

Utilizator topala.andreiTopala Andrei topala.andrei Data 22 februarie 2018 18:05:46
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("pinex.in");
ofstream g("pinex.out");

const int rad_B= 1000000;

long long A,B;
int N,K;
int divi[30],fprim[80000];

bool prim[rad_B];

void prime()
{
    int i, j;

    for (i = 2; i < rad_B; i++)
        prim[i] = 1;
    for (i = 2; i < rad_B; i++)
        if (prim[i])
        {
            for (j = 2*i; j < rad_B; j += i)
                prim[j] = 0;

            fprim[++fprim[0]] = i;
        }

}
long long pinex()
{
    int k=0, nrdiv=0, i, j;
    while (B > 1)
    {
        k++;
        if (B % fprim[k] == 0)
            divi[++nrdiv] = fprim[k];

        while (B % fprim[k] == 0)
            B/=fprim[k];

        if (fprim[k] * fprim[k]  > B && B>1 )
        {
            divi[++nrdiv] = B;
            B=1;
        }
    }

    long long sol=A, prod;
    int nr,p;
    for (i=1;i < (1 << nrdiv); i++)
    {
        prod = 1;
        nr=0;
        for (j=0; j<nrdiv; j++)
        {
            if (i & (1<<j))
            {
                prod = 1LL * prod * divi[j+1];
                nr++;
            }
        }
        if (nr % 2 != 0) p=-1;
        else p=1;

        sol += 1LL * p * A / prod;
    }

    return sol;

}
int main()
{
    f>>N;

    prime();
    for (int i=1; i<=N; i++)
    {
        f>>A>>B;
        g<<pinex()<<'\n';
    }

    return 0;
}