Cod sursa(job #3154304)

Utilizator dragutamihai1234Draguta Mihai dragutamihai1234 Data 4 octombrie 2023 09:24:09
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>


using namespace std;

bool  v[1000010];
int p[80000];

void ciur(int n)
{
    v[0] = v[1] = 1;
    for(int i = 4; i <= n; i += 2)
        v[i] = 1;
    for(int i = 3; i * i <= n; i += 2)
        if(v[i] == 0)
            for(int j = i * i; j <= n; j += 2 * i)
                v[j] = 1;
}

long long d[15];

int main()

{
    ifstream cin("pinex.in");
    ofstream cout("pinex.out");
    ciur(1000000);
    int cnt = 0;
    for(int i = 2; i <= 1000000; i++)
        if(v[i] == 0)
        {
            cnt++;
            p[cnt] = i;
        }
    //  p[1].......p[cnt]   cnt=78498
    int m;
    cin >> m;
    while(m)
    {
        long long a, b;
        cin >> a >> b;
        // d[0].....d[k-1] k=nr de divizori primi
        int ind = 1;
        int k = 0;
        while(p[ind]*p[ind] <= b && b > 1)
        {
            if(b % p[ind] == 0)
            {
                while(b % p[ind] == 0)  b /= p[ind];
                d[k] = p[ind];
                k++;
            }
            ind++;
        }
        if(b > 1)
        {
            d[k] = b;
            k++;
        }
        // d[0].....d[k-1] k=nr de divizori primi
        int x, j;
        long long contor, suma = 0;
        for(x = 1; x < (1 << k); x++)
        {
            contor = 0;
            long long div = 1;
            for(j = 0; j < k; j++)
                if(x & (1 << j))
                {
                    contor++;
                    div *= d[k - j - 1];
                }
            if(contor % 2 == 0)
                suma -= (a / div);
            else
                suma += (a / div);
        }
        cout << a - suma << '\n';
        m--;
    }
    return 0;
}