Cod sursa(job #925684)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 24 martie 2013 17:55:19
Problema Principiul includerii si excluderii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

typedef long long LL;
const int MAXN = 1000000;

LL A, B;
LL Ans;
bool Prim[MAXN + 10];
int st[40];
LL Fact[40];
vector <LL> Prime;

void Ciur ()
{
    int i, j;

    Prime.push_back (2);

    for (i = 3; i * i <= MAXN; i += 2)
        if (!Prim[i])
            for (j = i * i; j <= MAXN; j += (2 * i))
                Prim[j] = 1;

    for (i = 3; i <= MAXN; i += 2)
        Prime.push_back (i);
}

void update (int lev, LL prod)
{
    if (lev & 1)
        Ans += (A / prod);
    else
        Ans -= (A / prod);
}

void back (int lev, LL prod)
{
    update (lev, prod);
    int i;

    for (i = st[lev - 1] + 1; i <= Fact[0]; i ++){
        st[lev] = i;
        if ((long long) prod * Fact[i] > A)
            continue;
        back (lev + 1, (long long) prod * Fact[i]);
    }
}

LL Solve ()
{
    int i = 0, N;
    N = Prime.size ();

    while (B > 1 && i < N && (long long) Prime[i] * Prime[i] < B){
        if (B % Prime[i] == 0){
            Fact[++ Fact[0]] = Prime[i];

            while (B % Prime[i] == 0)
                B /= Prime[i];
        }
        i ++;
    }

    if (B > 1)
        Fact[++ Fact[0]] = B;

    back (1, 1);
    return Ans;
}

int main()
{
    int T;

    Ciur ();
    for (in >> T; T; T --){
        in >> A >> B;
        Ans = 0;
        Fact[0] = 0;
        out << Solve () << "\n";
    }

    return 0;
}