Cod sursa(job #3369278)

Utilizator Alias47John Doe Alias47 Data 19 octombrie 2026 09:33:19
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vc;
typedef vector<vector<int>> matrix;
#define ft(n) for(ull i=1; i<=n; i++)
#define sp ' '
string file = "pinex";
ifstream f(file + ".in");
ofstream g(file + ".out");

int n;
ll a, b, res;

const int ciurmax = 1e6; //already sqrt
bool notprime[ciurmax + 5];
vector<int> primes(1, 2);
void ciur()
{
    for (int i = 4; i <= ciurmax; i += 2)
        notprime[i] = 1;
    for (int i = 3; i <= ciurmax; i += 2)
        if (notprime[i] == 0)
        {
            primes.push_back(i);
            for (int j = 2 * i; j <= ciurmax; j += i)
                notprime[j] = 1;
        }
}

void desc(ll n, vc& v)
{
    for (int d : primes)
    {
        if (d > n)
            break;
        if (n % d == 0)
            v.push_back(d);
        while (n % d == 0)
            n /= d;
    }
    if (n > 1)
        v.push_back(n); //b has a prime factor bigger than sqrt(10^12)
}

void bkt(int n, vc v)
{
    int nr = (1 << n);
    for (int i = 1; i < nr; i++)
    {
        bitset<20> x(i);
        ll prod = 1;
        for (int j = 0; j < n; j++)
            if (x[j] == 1)
                prod *= v[j]; //no lcm needed
        int semn = 1;
        if (x.count() % 2 == 1)
            semn = -1;
        res += semn * a / prod;
    }
}

void pinex(ll a, ll b)
{
    vector<int> pfactors; //can only have at most ~15 prime factors
    desc(b, pfactors);
    res = a;
    bkt(pfactors.size(), pfactors);
    g << res << '\n';
}

int main()
{
    ciur();
    f >> n;
    for (int i = 1; i <= n; i++)
    {
        f >> a >> b;
        pinex(a, b);
    }
    return 0;
}