Cod sursa(job #2973560)

Utilizator donCiuarinArin Donciu donCiuarin Data 1 februarie 2023 10:48:45
Problema Principiul includerii si excluderii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define DM 100005
#define pb push_back

using namespace std;

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

int t, x, y, vf = 0;
int divizori[DM];

void bkt(int a, int inceput, int nr, int k, int & ksum)
{
    if(!nr)
    {
        ksum += a / k;
        return;
    }
    int i;
    for(i = inceput; i <= vf; i++)
        bkt(a, i + 1, nr - 1, k * divizori[i], ksum);
}

int pinex(int a, int b)
{
    int d = 2, ans = 0, sum, i;
    vf = 0;
    while(d * d <= b)
    {
        if(b % d == 0)
        {
            divizori[++vf] = d;
            while(b % d == 0)
                b /= d;
        }
        d++;
    }
    if(b > 1)
        divizori[++vf] = b;
    for(i = 1; i <= vf; i++)
    {
        sum = 0;
        bkt(a, 1, i, 1, sum);
        if(i % 2 == 1)
            ans += sum;
        else
            ans -= sum;
    }

    return a - ans;
}

int main()
{
    fin >> t;
    for(; t; t--)
    {
        fin >> x >> y;
        fout << pinex(x, y) << '\n';
    }
    return 0;
}