Cod sursa(job #1567628)

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

using namespace std;

int n;
int a, b;
int dimensiune;
int numar;

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

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

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

void descompune()
{
    descompunere.clear();

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

    dimensiune = descompunere.size();
}

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

    createCiur();

    scanf("%d", &n);

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

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

            for(int 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("%d\n", a - numar);
    }

    return 0;
}