Cod sursa(job #1680301)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 8 aprilie 2016 17:19:59
Problema Principiul includerii si excluderii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("pinex.in");
ofstream g("pinex.out");

const int prim = 1000000;
long long n, a, b, nrprim;
int p[prim+5];
int nr, d;
long long sol;
int fact[prim+5];
bool seen[prim+5];

void Precalc()
{
    seen[0] = seen[1] = 1;
    for(int i = 2; i <= prim; i++)
    {
        if(seen[i] == 0)
        {
            for(int j = i; j <= prim; j=j+i) seen[j] = 1;
            p[++nrprim] = i;
        }
    }
}

void Solve()
{
    nr = 0;
    d = 0;
    while(b>1)
    {
        //cout<<b<<' ';
        d++;
        if(b%p[d] == 0)
        {
            fact[nr++] = p[d];
            while(b%p[d] == 0)
            {
                b /= p[d];
            }
        }
    }
    sol = 0;
    for(int i = 1; i < (1<<nr); i++)
    {
        long long m = 0, prod = 1;
        for(int j = 0; j < nr; j++)
        {
            if((1<<j) & i)
            {
                prod = prod*1LL*fact[j];
                m++;
            }
        }
        if(m%2 == 1) m = 1;
        else m = -1;
        sol = sol + 1LL*m*a/prod;
    }
    g<<a-sol<<'\n';
}

int main()
{
    f>>n;
    Precalc();
    //for(int i = 0; i<nr; i++) cout<<p[i]<<' ';
    while(n--)
    {
        f>>a>>b;
        //cout<<a<<b;
        Solve();
    }
    return 0;
}