Cod sursa(job #2698281)

Utilizator Anna123Anna Negrea Anna123 Data 21 ianuarie 2021 17:08:05
Problema Principiul includerii si excluderii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
#define ll long long
#define PMax 13
#define ValMax 1000001
#define PrimMax 78499

using namespace std;

ifstream fin ( "pinex.in" );
ofstream fout ( "pinex.out" );

int m;
int a, b;
int p[PMax];
bool ciur[ValMax];
int prim[PrimMax];

void Ciur()
{
    ciur[0] = 1;
    ciur[1] = 1;
    for ( int i = 2; i * i < ValMax; i++ )
        if ( !ciur[i] )
            for ( int j = i * i; j < ValMax; j += i )
                ciur[j] = 1;
}

void CreazaPrime()
{
    for ( int i = 2; i < ValMax; i++ )
        if ( !ciur[i] )
            prim[++prim[0]] = i;
}

int solve()
{
    int lg = 0;
    int ind = 1;
    while ( prim[ind] * prim[ind] <= b )
    {
        int e = 0;
        while ( b % prim[ind] == 0 )
        {
            b /= prim[ind];
            e++;
        }
        if ( e != 0 )
            p[lg++] = prim[ind];
        ind++;
    }
    if ( b > 1 )
        p[lg++] = b;

    ll sol = 0;
    for ( int i = 1; i < (1 << lg); i++ )
    {
        int nr = 0;
        ll prod = 1;
        for ( int j = 0; j < lg; j++ )
        {
            if ( (1 << j) & i )
            {
                nr++;
                prod *= p[j];
            }
        }
        if ( nr % 2 == 0 ) sol -= (a / prod);
        else sol += (a / prod);
    }
    return a - sol;

}

bool Eprim( ll x )
{
    ll d = 2;
    while ( d * d <= x )
    {
        if ( x % d == 0 )
            return 0;
        d++;
    }
    return 1;
}

int main()
{
    Ciur();
    CreazaPrime();
    fin >> m;
    for ( int i = 1; i <= m; i++ )
    {
        fin >> a >> b;
        fout << solve() << '\n';
    }
    return 0;
}