Cod sursa(job #1971043)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 19 aprilie 2017 19:40:19
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define BIT(x) (1<<(x))
using namespace std;
ifstream f("pinex.in");
ofstream g("pinex.out");

long long T,A,B;
bitset<10000002> isPrime;
vector<int> Primes,Divisors;

void getPrimes()
{
    Primes.push_back(2);
    for(int i=3;i<=1000;i+=2)
        if (!isPrime[i])
            for (int j=i*i; j<=1000000; j+=i)
                isPrime[j] = 1;

    for(int i=3;i<=1000000;i+=2)
        if (!isPrime[i])
            Primes.push_back(i);
}

void getFactors()
{
    for(auto it:Primes)
    {
        if(it*it>B) break;
        if(B==1) break;

        if (B%it == 0)
        {
            Divisors.push_back(it);
            while (B%it == 0)
            {
                B/=it;
            }
        }
    }
    if (B!=1)
        Divisors.push_back(B);
}

void getNumber()
{
    int Size=Divisors.size();
    int nrBytes;
    long long number=0,tmp=1;

    for(int i = 1; i < BIT(Size); i++)
    {
        tmp = 1;
        nrBytes=0;
        for(int j=0;j<Size;j++)
        {
            if(i & BIT(j))
            {
                nrBytes++;
                tmp*= Divisors[j];
            }
        }
        if(nrBytes&1) number+=A/tmp;
        else number-=A/tmp;
    }
    g<<A-number<<'\n';
}

void solve()
{
    f>>T;
    while(T--)
    {
        Divisors.clear();
        f>>A>>B;
        getFactors();
        getNumber();
    }
}

int main()
{
    getPrimes();
    solve();
}