Cod sursa(job #3167539)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 10 noiembrie 2023 20:07:26
Problema Principiul includerii si excluderii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include<bits/stdc++.h>
using namespace std;

const int BMAX = 1e6 + 5;
long long a, b, ans;
vector<int> primes, div_nr;
bool ciur[BMAX];

void create_Ciur()
{
    for(int i = 2; i <= BMAX; i++)
    {
        if(!ciur[i])
        {
            primes.push_back(i);
            for(int j = i * 2; j <= BMAX; j += i)
            {
                ciur[j] = true;
            }
        }
    }
}

void bkt(int pos, int sign, long long prod)
{
    if(pos == div_nr.size())
    {
        ans += sign * (a / prod);
        return;
    }

    bkt(pos + 1, sign, prod);
    bkt(pos + 1, sign * -1, prod * div_nr[pos]);
}

void query()
{
    ans = 0;
    div_nr.clear();
    cin >> a >> b;

    for(auto nr : primes)
    {
        if(1LL * nr * nr > b)
            break;

        if(b % nr == 0)
        {
            div_nr.push_back(nr);
            while(b % nr == 0)
                b /= nr;
        }
    }

    if(b > 1)
    {
        div_nr.push_back(b);
        b = 1;
    }

    bkt(0, 1, 1);

    cout << ans << "\n";
}

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

    int t;
    cin >> t;

    while(t--)
        query();
}