Cod sursa(job #2277763)

Utilizator q1e123Solca Robert-Nicolae q1e123 Data 6 noiembrie 2018 20:15:56
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>

#define ll long long
#define MAX 1000001

using namespace std;

ifstream INPUT_FILE("pinex.in");
ofstream OUTPUT_FILE("pinex.out");

bool viz[MAX];

vector<int> nrPrime;


void ciur(){
    for(long i=2;i<=MAX;++i){
        if(!viz[i]){
            nrPrime.push_back(i);
            for(long j=2;i*j<=MAX;++j) viz[i*j]=1;
        }
    }
}

void solve(ll a,ll b){
    vector<int> divizori;
    for(int tmp=0;tmp<nrPrime.size() && nrPrime[tmp]*nrPrime[tmp]<=b;++tmp){
        if(b%nrPrime[tmp]==0){
            divizori.push_back(nrPrime[tmp]);
            while(b%divizori.back()==0) b/=divizori.back();
        }
     }
    if(b!=1) divizori.push_back(b);

    ll sol=a;

    for(int i=1;i< (1<<divizori.size());++i){
        ll semn,prod;
        semn=0;
        prod=1;
        for(int j=0;j<divizori.size();++j){
            if((1<<j)&i){
                prod*=divizori[j];
                ++semn;
            }
        }
        if(semn&1) semn=-1;
        else semn=1;
        sol+=(semn*a/prod);
    }
    OUTPUT_FILE<<sol<<"\n";
}

void init() {
    ios::sync_with_stdio(false);
    ciur();
}


int main() {
    ll m;
    init();
    INPUT_FILE>>m;
    for(int i=0;i<m;++i){
        ll a,b;
        INPUT_FILE>>a>>b;
        solve(a,b);
    }
    return 0;
}