Cod sursa(job #2728445)

Utilizator florinrafiliuRafiliu Florin florinrafiliu Data 23 martie 2021 11:48:09
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int maxN = 1e6;

int prim[maxN+5], fact[80005], k;
long long divp[35];

void ciur() {
    prim[0] = prim[1] = 1;
    for(int i = 2; i * i <= maxN; ++i) {
        if(prim[i] == 0) {
            for(int j = i*i; j <= maxN; j += i)
                prim[j] = 1;
        }
    }
    for(int i = 2; i <= maxN; ++i)
        if(prim[i] == 0)
            fact[++k] = i;
}

long long solve(long long a, long long b) {
    long long t = 0, j = 0;
    while(b != 1) {
        j += 1;
        if(b % fact[j] == 0)
            divp[++t] = fact[j];
        while(b % fact[j] == 0) {
            b /= fact[j];
        }
        if(fact[j] * fact[j] > b && b > 1) {
            divp[++t] = b;
            b = 1;
        }
    }

    long long ras = a;
    for(int i = 1; i < (1 << t); ++i) {
        long long cnt = 0, ans = 1;
        for(int j = 0; j < t; ++j)
            if((1 << j) & i) {
                ans = 1ll * ans * divp[j + 1];
                cnt += 1;
            }
        if(cnt % 2 == 1) cnt = -1;
        else cnt = 1;

        ras = ras + 1ll * cnt * a / ans;
    }
    return ras;
}

int main()
{
    int n; fin >> n;
    ciur();
    for(int i = 1; i <= n; ++i) {
        long long a, b; fin >> a >> b;
        fout << solve(a, b) << "\n";
    }
    return 0;
}