Cod sursa(job #3252802)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 31 octombrie 2024 11:22:47
Problema Principiul includerii si excluderii Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>

const std :: string FILENAME = "pinex";

std :: ifstream f (FILENAME + ".in");

std :: ofstream g (FILENAME + ".out");

const int NMAX = 1e6 + 100;

int q;

long long a;

long long b;

std :: vector <int> p;

std :: bitset <NMAX> c;

std :: vector <int> fact;

void precalc()
{
    c[0] = c[1] = true;

    for(int i = 2; i <= NMAX; i ++)
    {
        if(c[i] == false)
        {
            for(int j = 2; i * j <= NMAX; j ++)
            {
                c[i * j] = true;
            }
        }
    }

    for(int i = 2; i <= NMAX; i ++)
    {
        if(c[i] == false)
        {
            p.push_back(i);
        }
    }
}

inline long long solve()
{
    long long ans = a;

    for(int mask = 1; mask < (1 << fact.size()); mask ++)
    {
        int bit = 0;

        long long prod = 1;

        for(int i = 0; i < (int)fact.size(); i ++)
        {
            if(mask & (1 << i))
            {
                prod *= fact[i];

                bit ++;
            }
        }

        int semn = (bit % 2 == 0) ? 1 : -1;

        ans += semn * (a / prod);
    }

    return ans;
}

int main()
{
    precalc();

    f >> q;

    while(q --)
    {
        f >> a >> b;

        for(int i = 2; i <= b; i ++)
        {
            if(b % i == 0 && c[i] == false)
            {
                fact.push_back(i);

                while(b % i == 0)
                {
                    b /= i;
                }
            }

            if(i * i >= b)
            {
                fact.push_back(b);

                break;
            }
        }

        g << solve() << '\n';

        fact.clear();
    }

    return 0;
}