Cod sursa(job #1921023)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 10 martie 2017 11:06:11
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <cmath>
#define P_MAX 1000000
using namespace std;
ifstream f ("pinex.in");
ofstream g ("pinex.out");
bitset < P_MAX + 1 > v;
vector < int > PN, Div;
int m, a, b;

void PrimeClac()
{
    PN.clear();
    for (int i = 2; i < P_MAX; i++)
        if (!v[i])
        {
            for (int j = 2 * i; j <= P_MAX; j += i)
                v[j] = 1;
            PN.push_back(i);
        }
}
int Sol()
{
    Div.clear();
    int d = 0;
    while (b > 1)
    {
        if (b % PN[d] == 0)
        {
            while (b % PN[d] == 0)
                b /= PN[d];
            Div.push_back(PN[d]);
        }
        if (PN[d] > sqrt(b) &&  b > 1)
        {
            Div.push_back(b);
            b = 1;
        }
        d++;
    }
    long long sol = a;
    for (int i = 1; i < (1 << Div.size()); i++)
    {
        long long prod = 1, nr = 0;
        for (int j = 0; j < Div.size(); j++)
            if (i & (1 << j))
                prod = 1LL * prod * Div[j],
                nr++;
        if (nr % 2) sol -= a / prod;
        else sol += a / prod;
    }
    return sol;
}

int main()
{
    PrimeClac();
    f>>m;
    while (m--)
    {
        f>>a>>b;
        g<<Sol()<<'\n';
    }
    return 0;
}