Cod sursa(job #2062516)

Utilizator TavinciStefanescu Octavian Tavinci Data 10 noiembrie 2017 15:51:10
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");

long long a, b, sub, op[100];
long long n, i, S, j, nr, k, m, p[80000], d[100], nrd, nrp=78498;
bool ciur[1000010];


void suma (long long p)
{
    if (p == k+1)
    {
        long long pF = 1;
        for (int j = 1; j <= k; j++)
            pF *= d[op[j]];
        sub += a/pF;
    }
    else
    {
        for (long long i = op[p-1]+1; i <= nrd; i++)
        {
            op[p] = i;
            suma(p+1);
        }
    }
}

int main ()
{

    for (i = 2; i <= 1000000; i++)
        if (ciur[i] == 0)
        {
            nr++;
            p[nr] = i;
            for (j = 2; j*i <= 1000000; j++)
                ciur[i*j] = 1;
        }

    fin >> m;
    for(int l=1; l<=m; l++)
    {
        fin >> a >> b;
        nrd = 0;
        for (nr=1; b > 1 && nr <= nrp; nr++)
        {
            k = 0;
            while (b%p[nr] == 0)
            {
                b /= p[nr];
                k = 1;
            }
            if (k == 1)
            {
                nrd++;
                d[nrd] = p[nr];
            }
        }
        if (b > 1)
        {
            nrd++;
            d[nrd] = b;
        }

        S = a;
        bool p = 0;
        for (i = 1; i <= nrd; i++)
        {
            k = i;
            sub = 0;
            suma(1);
            if (p == 0)
            {
                S -= sub;
                p = 1;
            }
            else
            {
                S += sub;
                p = 0;
            }
        }
        fout << S << "\n";
    }
}