Cod sursa(job #3331015)

Utilizator andrei_obrejaAndrei Obreja andrei_obreja Data 23 decembrie 2025 19:18:12
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");
long long A;
vector<long long> prime;
long long neprime;

vector<long long> factori_primi(long long B) {
    vector<long long> f;
    for (long long d = 2; d * d <= B; d++) {
        if (B % d == 0) {
            f.push_back(d);
            while (B % d == 0)
                B /= d;
        }
    }
    if (B > 1)
        f.push_back(B);
    return f;
}

void pinex(int pos, long long produs, int cnt) {
    if (pos == prime.size()) {
        if (cnt == 0) return;

        long long val = A / produs;

        if (cnt % 2 == 1)
            neprime += val;
        else
            neprime -= val;

        return;
    }

    pinex(pos + 1, produs, cnt);

    if (produs <= A / prime[pos]) {
        pinex(pos + 1, produs * prime[pos], cnt + 1);
    }
}

int main() {
    int M;
    fin >> M;

    while (M--) {
        long long B;
        fin >> A >> B;

        prime = factori_primi(B);
        neprime = 0;

        pinex(0, 1, 0);

        fout << A - neprime << "\n";
    }

    return 0;
}