Cod sursa(job #3148578)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 2 septembrie 2023 17:56:54
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream in ("pinex.in");
ofstream out ("pinex.out");

const long long max_size = 1e6 + 1;

bool ciur[max_size];
vector <long long> pr;

void ciuru ()
{
    ciur[0] = 1;
    ciur[1] = 1;
    for (long long i = 2; i < max_size; i++)
    {
        if (ciur[i] == 1)
        {
            continue;
        }
        pr.push_back(i);
        for (long long j = 2 * i; j < max_size; j += i)
        {
            ciur[j] = 1;
        }
    }
}

void solve ()
{
    vector <long long> divz;
    long long x, y;
    in >> x >> y;
    for (auto f : pr)
    {
        if (f > y)
        {
            break;
        }
        if (y % f == 0)
        {
            divz.push_back(f);
            while (y % f == 0)
            {
                y /= f;
            }
        }
    }
    if (y != 1)
    {
        divz.push_back(y);
    }
    long long ans = 0;
    for (long long i = 1; i < (1LL << divz.size()); i++)
    {
        long long val = -1;
        for (long long j = 0; j < divz.size(); j++)
        {
            if ((i & (1LL << j)) != 0)
            {
            //    out << divz[j] << " ";
                val *= (-divz[j]);
            }
        }
        //out << val << '\n';
        ans += x / val;
    }
    out << x - ans << '\n';
}

signed main ()
{
    ciuru();
    long long t;
    in >> t;
    while (t--)
    {
        solve();
    }
    in.close();
    out.close();
    return 0;
}