Cod sursa(job #2374313)

Utilizator AlexTheDagonBogdan Tudor AlexTheDagon Data 7 martie 2019 17:55:28
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int NM = 1000005;
typedef long long ll;

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

vector<ll> prime;
vector<ll> divB;
int eprim[NM];

void ciur(){
    for(int i=2;i<NM;++i)
        eprim[i]=1;
    for(int i=2;i<NM;++i){
        if(eprim[i]){
            prime.pb(i);
            for(int j=i+i;j<NM;j+=i)
                eprim[j]=0;
        }
    }

}


ll solve(ll A,ll B){
    divB.clear();
    for(auto e:prime)
        if(B%e==0)
        {
            divB.pb(e);
            while(B%e==0)B/=e;
        }
    if(B>1)divB.pb(B);
    ll n=divB.size();
    ll semn=1;
    ll val=1;
    ll sol=A;
    for(int mask=1;mask<(1<<n);++mask){
        val=1;
        semn=1;
        for(int i=0;i<n;++i){
            if(mask&(1<<i)){
                val=val*divB[i];
                semn=semn*(-1);
            }
        }
       sol=sol+semn*(A/val);
    }
    return sol;
}

int main()
{
    ciur();
    int t;
    ll x,y;
    in>>t;
    while(t--){
        in>>x>>y;
        out<<solve(x,y)<<'\n';
    }
    return 0;
}