Cod sursa(job #2704715)

Utilizator andreibazavanAndrei Bazavan andreibazavan Data 11 februarie 2021 08:43:37
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");
#define nmax 1000010
long long i,j,n,k,a,b,nr,rez,nrc,v[1000001],prim[1000001];
bool p[1000001];
int main()
{
    for(i=4; i<=nmax; i+=2)p[i]=1;
    prim[++nr]=2;
    for(i=3; i<=nmax; i+=2)
    {
        if(p[i]==0)
        {
            prim[++nr]=i;
            for(j=3*i; j<=nmax; j+=i)
            {
                p[j]=1;

            }
        }
    }
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>a>>b;
        long long m=0;
        j=1;
        while(prim[j]*prim[j]<=b&&b>1)
        {
            if(b%prim[j]==0)
            {
                v[++m]=prim[j];
                while(b%prim[j]==0) b=b/prim[j];
            }
            j++;
        }
        if(b>1)
        {
            v[++m]=b;
        }
        long long nn=1<<m;
        rez=a;
        for(j=1; j<nn; j++)
        {
            nrc=0;
            long long   pp=1;
            for(k=0; k<m; k++)
            {
                if(j&(1LL<<k))
                {
                    nrc++;
                    pp=pp*v[k+1];
                }
            }
            if(nrc%2==1)rez=rez-a/pp;
            else rez+=a/pp;

        }
        fout<<rez<<'\n';
    }
    return 0;
}