Cod sursa(job #1975271)

Utilizator papinub2Papa Valentin papinub2 Data 30 aprilie 2017 13:27:17
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
# include <fstream>

using namespace std;

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

int t, k, nr, w;
unsigned long long a, b, s, prod = 1;
int OK[1000000], p[1000000], divizor[1000000], q[1000000];

int verifica (int t)
{
    for (int i = 1; i <= t - 1; i++)
        if (q[i] == q[t] || q[i] > q[i+1])
            return 0;

    return 1;
}

void backtracking (int e)
{
    if (e == w + 1)
    {
        for (int i = 1; i <= w; i++)
            prod = prod * q[i];

        if (w % 2 == 1)
            s = s + a / prod;

        else

            s = s - a / prod;

            prod = 1;

        return;
    }

    for (int i = 1; i <= nr; i++)
    {
        q[e] = divizor[i];

        if (verifica(e)) backtracking(e + 1);
    }
}

int main()
{
    for (int i = 2; i <= 10000; i++)
    {
        if (OK[i] == 0)
        {
            for (unsigned long long j = i * i; j <= 10000; j = j + i)
                OK[j] = 1;

            k++;
            p[k] = i;
        }
    }

    in >> t;

    for (int i = 1; i <= t; i++)
    {
        in >> a >> b;

        for (int j = 1; j <= k; j++)
        {
            if (p[j] > b)
                break;

            if (b % p[j] == 0)
            {
                nr++;

                divizor[nr] = p[j];
            }
        }

        for (int x = 1; x <= nr; x++)
        {
            w = x;

            backtracking(1);
        }

        out << a - s << '\n';

        s = 0;

        nr = 0;

    }

    return 0;
}