Cod sursa(job #2494960)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 18 noiembrie 2019 18:33:22
Problema Principiul includerii si excluderii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
#define dim 1000004
using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");
bitset <dim> fr;
long long prim[dim/10];
long long k,q,i,n,st,nr,v[200],sum;
unsigned long long a,b,p=1;
void backtr(int pas,int nr1)
{
    if(pas>nr)
    {
        if(p==1)
            return;
        if(nr1%2==1)
        {
            sum+= a/p;
        }
        else
        {
            sum-=a/p;
        }
        return;
    }
    p*=v[pas];
    backtr(pas+1,nr1+1); /// am inmultit cu elementul din v de  pe pozitia pas
    p/=v[pas];
    backtr(pas+1,nr1);
}
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&&st<=k)
        {
            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;
        if(nr==0){
            sum=a;
        }else
        backtr(1,0);
        fout<<a-sum<<"\n";
    }
}