Cod sursa(job #791882)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 25 septembrie 2012 18:03:04
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <cstring>

#define MAX 1000005
#define ll long long

using namespace std;

int prm[MAX], n;
ll f[MAX], a, b;
bool p[MAX];

void ciur()
{
    prm[++prm[0]] = 2;
    for(int i = 3; i < MAX; i += 2)
        if(!p[i])
        {
            prm[++prm[0]] = i;
            for(int j = i; j < MAX; j += i)
                p[j] = true;
        }
}

ll solve(ll a, ll b)
{
    f[0] = 0;
    int i = 0;
    while(b > 1)
    {
        i++;
        if(b % prm[i] == 0)
        {
            f[++f[0]] = prm[i];
            while(b % prm[i] == 0) b /= prm[i];
        }
        if(1LL * prm[i] * prm[i] > b && b > 1)
        {
            f[++f[0]] = b;
            b = 1;
        }

    }
    ll sol = a;
    for(int conf = 1; conf < (1 << (f[0])); conf++)
    {
        ll prod = 1, nr = 0;
        for(int i = 0; i < f[0]; i++)
            if((1 << i) & conf)
            {
                nr++;
                prod *= 1LL * f[i + 1];
            }
        if(nr & 1) nr = -1;
        else nr = 1;
        sol += 1LL * nr * a / prod;
    }
    return sol;
}

int main()
{
    ifstream in("pinex.in"); ofstream out("pinex.out");
    in>>n; ciur();
    while(n--)
    {
        in>>a>>b;
        out<<solve(a, b)<<"\n";
    }
    in.close(); out.close();
    return 0;
}