Nu aveti permisiuni pentru a descarca fisierul grader_test45.ok

Cod sursa(job #1567642)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 13 ianuarie 2016 17:12:35
Problema Principiul includerii si excluderii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>
#include <vector>

using namespace std;

long long n;
long long a, b;
long long dimensiune;
long long numar;

bool ciur[1000000];
vector<long long> prime;
vector<long long> descompunere;

void createCiur()
{
    for(long long i = 2; i < 1000000; i++)
    {
        if(ciur[i] == false)
        {
            prime.push_back(i);

            for(long long j = i * 2; j < 1000000; j += i)
            {
                ciur[j] = true;
            }
        }
    }
}

void descompune()
{
    descompunere.clear();

    for(long long i = 0; i < prime.size(); i++)
    {
        if(b % prime[i] == 0)
        {
            descompunere.push_back(prime[i]);
        }
        while(b % prime[i] == 0)
        {
            b /= prime[i];
        }
        if(prime[i] > b)
        {
            break;
        }
    }

    if(b != 1)
    {
        descompunere.push_back(b);
        b = 1;
    }

    dimensiune = descompunere.size();
}

int main()
{
    freopen("pinex.in", "r", stdin);
    freopen("pinex.out", "w", stdout);

    createCiur();

    scanf("%lld", &n);

    for(long long i = 0; i < n; i++)
    {
        scanf("%lld %lld", &a, &b);
        descompune();
        numar = 0;

        for(long long x = 1; x < (1 << dimensiune); x++)
        {
            long long produs = 1;
            long long nr = 0;

            for(long long j = 0; j < dimensiune; j++)
            {
                if((x & (1 << j)) != 0)
                {
                    nr++;
                    produs *= descompunere[j];
                }
            }

            if(nr % 2 != 0)
            {
                numar += (a / produs);
            }
            else
            {
                numar -= (a / produs);
            }
        }

        printf("%lld\n", a - numar);
    }

    return 0;
}