Cod sursa(job #3200828)

Utilizator cristianabalcanuCristiana Balcanu cristianabalcanu Data 5 februarie 2024 20:28:33
Problema Principiul includerii si excluderii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#define MX 1000005
using namespace std;
ifstream fin ("pinex.in");
ofstream fout ("pinex.out");

int n, a, b, r;
int d[55], nrd;

int c[MX], p[100005], nrp;

void ciur()
{
    for(int i = 2 ; i <= MX ; i++)
    {
        if(c[i] == 1)
            continue;
        nrp++;
        p[nrp] = i;
        for(int j = i + i ; j <= MX ; j += i)
            c[j] = 1;
    }
}

void div(int a)
{
    nrd = 0;
    int ca = a;
    for(int i = 1 ; i <= nrp && a > 0 && a > p[i]; i++)
    {
        if(a % p[i] == 0)
        {
            nrd++;
            d[nrd] = p[i];
        }
        while(a % p[i] == 0)
            a = a / p[i];
    }
    if(a != 0)
    {
        nrd++;
        d[nrd] = a;
    }
}

void bkt(int ind, int prod, int nrprod)
{
    if(nrprod % 2 == 0 && nrprod != 0)
        r += a / prod;
    if(nrprod % 2 != 0 && nrprod != 0)
        r -= a / prod;
    for(int i = ind ; i <= nrd ; i++)
    {
        bkt(i + 1, prod * d[i], nrprod + 1);
    }
}

int main()
{
    fin >> n;
    ciur();
    while(n > 0)
    {
        n--;
        fin >> a >> b;
        div(b);
        r = a;
        bkt(1, 1, 0);
        fout << r << '\n';
    }
    return 0;
}