Cod sursa(job #2924832)

Utilizator Maftei_TudorMaftei Tudor Maftei_Tudor Data 11 octombrie 2022 18:39:49
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>

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

long long prime[1000004], fact[31];
bool ciur[1000004];

void ciurf()
{
    for(long long i=2; i<=1000000; i++)
        if(ciur[i]==0)
    {
        prime[0]++;
        prime[prime[0]]=i;
        for(long long j=2; i*j<=1000000; j++)
            ciur[i*j]=1;
    }

}
void rez(long long a, long long b)
{
    long long i=1;
    for(i=0; i<=30; i++)
        fact[i]=0;
    i=1;
    while(b>1 && i<=prime[0])
    {
        if(b%prime[i]==0)
        {
            fact[0]++;
            fact[fact[0]]=prime[i];
            while(b%prime[i]==0)
                b/=prime[i];
        }
        i++;
    }
    if(b>1)
    {
        fact[0]++;
        fact[fact[0]]=b;
    }
    long long r=0;
    for(i=1; i<(1<<fact[0]); i++)
    {
        long long semn=0, prod=1;
        for(long long j=0; (1<<j)<=i; j++)
            if((1<<j) & i)
        {
            semn++;
            prod*=fact[j+1];
        }
        if(semn%2==1)
            semn=1;
        else semn=-1;

        r+=semn*a/prod;
    }
    fout<<a-r<<'\n';

}

long long n, a, b;

int main()
{

    ciurf();
    fin>>n;

    for(long long i=1; i<=n; i++)
    {
        fin>>a>>b;
        rez(a, b);
    }
    return 0;
}