Cod sursa(job #1567718)

Utilizator sorynsooSorin Soo sorynsoo Data 13 ianuarie 2016 18:03:10
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
using namespace std;
ifstream cin("pinex.in");
ofstream cout("pinex.out");
#define MAXNR 1000000
int i,j,h,n,m,a,b,nrdivv,auxb,sum,crt, nrzero, crt_sum,crt_poz;

int prim[1000005],nrprim;
int divv[500005];
bool neprim[1000005];

void generare2()
{
    for(int i=2; i<=MAXNR; i+=2)
    {
        i=i;
        if(neprim[j]==false)
            for(int j=i+i; j<=MAXNR; j+=i)
                neprim[j]=true;
    }
    for(int i=2; i<=MAXNR; i++)
        if(!neprim[i])
        {
            prim[++nrprim]=i;
        }
}

int main()
{
    cin>>m;
    generare2();
    for(i=1; i<=m; i++)
    {
        cin>>a>>b;

        nrdivv=0; auxb=b;
        //Am format toti factorii primi
        for(j=1; j<=nrprim; j++)
        {
            if(auxb==1 || prim[j] * prim[j] >b)
                break;

            if( auxb % prim[j] == 0 )
            {
                divv[++nrdivv] = prim [j];
                while(auxb % prim[j] == 0)
                    auxb /= prim[j];
            }
        }
        if(auxb!=1)
            divv[++nrdivv]=auxb;

        sum=0;

        for(j=1; j <( 1<<nrdivv ); j++ )
        {
            crt=j; nrzero=0; crt_sum=1; crt_poz=0;

            for(h=0; h <=nrdivv; h++)
            {
                crt_poz++;
                if(j & (1<<h) && crt_poz <= nrdivv)
                {
                    nrzero++;
                    crt_sum= crt_sum * divv[crt_poz] ;
                }
            }

          //  cout<<a /crt_sum<<" ";
            if(nrzero % 2 == 1)
                sum+= ( a / crt_sum );
            else
                sum-= ( a / crt_sum );
        }
       // cout<<"\n";
        cout<<a-sum<<"\n";
    }
}