Cod sursa(job #2829312)

Utilizator Gabriel_DascalescuGabriel Dascalescu Gabriel_Dascalescu Data 8 ianuarie 2022 14:45:20
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <cmath>
#define nmax 1000005

using namespace std;

ifstream in("pinex.in");
ofstream out("pinex.out");

int c[nmax];

vector<int> vprim;
vector<int> vb;

void ciur()
{
    c[0] = c[1] = 1;
    for(int i=2; i<nmax; i++)
    {
        if(c[i] == 0)
        {
            vprim.push_back(i);
            for(int j=i+i; j<nmax; j+=i)
            {
                c[j] = 1;
            }
        }
    }
}

int n;
long long a, b, sum, prod;

int main()
{
    in>>n;
    ciur();
    for(int i=1; i<=n; i++)
    {
        in>>a>>b;
        vb.clear();
        for(int j=0; j<vprim.size(); j++)
        {
             if(b % vprim[j] == 0)
             {
                while(b % vprim[j] == 0)
                 {
                     b/=vprim[j];
                 }
                 vb.push_back(vprim[j]);
             }
             if(b==1)
                break;
        }
        if(b!=1)
        {
            vb.push_back(b);
        }
        sum = 0;
        for(int j=1; j<(1<<vb.size()); j++)
        {
            prod = 1;
            int cnt = 0;
            for(int h=0; h<vb.size(); h++)
            {
                if((j&(1<<h))==(1<<h))
                {
                    prod*= ( vb[h]);
                    cnt++;
                }
            }


            if(cnt%2==0)
                sum -= a/prod;
            else
                sum += a/prod;
           // out<<j<<' '<<prod<<' '<<cnt<<' '<<sum<<'\n';
        }
        out<<a-sum<<"\n";
    }
    return 0;
}