Cod sursa(job #2494920)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 18 noiembrie 2019 18:00:19
Problema Principiul includerii si excluderii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define dim 1000004
using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");
bitset <dim> fr;
int prim[dim/10],k,q,i,n,a,b,st,nr,v[200],sum;
void backtr(int pas,int nr1,int p)
{
    if(pas>nr)
    {
        if(p==1)
            return;
        if(nr1%2==1)
        {
            sum+= a/p;
        }
        else
        {
            sum-=a/p;
        }
        return;
    }
    backtr(pas+1,nr1+1,p*v[pas]); /// am inmultit cu elementul din v de  pe pozitia pas
    backtr(pas+1,nr1,p);
}
void  ciur()
{
    fr[1]=fr[0]=1;
    for(int i=4; i<=dim; i+=2)
        fr[i]=1;
    prim[++k]=2;
    for(int i=3; i<=dim; i+=2)
    {
        if(fr[i]==0)
        {
            prim[++k]=i;
            for(int j=2*i; j<=dim; j+=i)
                fr[j]=1;
        }
    }
   // cout<<k;
}
int main()
{
    ciur();
    fin>>q;
    for(; q; q--)
    {
        fin>>a>>b;
        /// descompun a
        st=1;
        nr=0;
        //   cout<<prim[1];
        while(prim[st]*prim[st]<=b)
        {
            if(b%prim[st]==0)
            {
                v[++nr]=prim[st];
                while(b%prim[st]==0)
                    b/=prim[st];
            }
            st++;
        }
        if(b!=1)
        {
            v[++nr]=b;
        }
        sum=0;
        backtr(1,0,1);
        fout<<a-sum<<"\n";
    }
}