Cod sursa(job #2419727)

Utilizator teisanumihai84Mihai Teisanu teisanumihai84 Data 9 mai 2019 12:11:12
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
using namespace std;
long long Q, a, b, i, j, dim, P[500001], divi[30], d, ok, aux1, aux2, pr, nr, sol, val;
bool p[1000001];
bool sub[21];
int main()
{
    ifstream fin ("pinex.in");
    ofstream fout ("pinex.out");
    fin>>Q;
    p[1]=1;
    for (i=2; i<=1000000; i++)
        if (p[i]==0) {
            P[++dim]=i;
            for (j=2*i; j<=1000000; j+=i)
                p[j]=1;
        }

    aux1=dim;
    for (int q=1; q<=Q; q++)
    {
        fin>>a>>b;
        dim=0;
        sol=0;
        for (d=1; d<=aux1 && b!=1; d++)
            if  (b%P[d]==0)
            {
                divi[++dim]=P[d];
                ok=1;
                while (b%P[d] == 0)
                    b /= P[d];
            }
        if (b!=1) {
            divi[++dim] = b;
        }
///        if (ok==0)
///            divi[++dim]=b;

        for (j=1; j<=dim; j++)
        sub[j]=0;
        val=(1<<dim)-1;
        for (i=1; i<=val; i++)
        {
            pr=1;
            nr=0;
            aux2=dim;
            while (sub[aux2]==1)
            {
                sub[aux2]=0;
                aux2--;
            }
            sub[aux2]=1;
            for (j=1; j<=dim; j++)
                if (sub[j]==1)
                {
                    pr*=divi[j];
                    nr++;
                }
            if (nr%2==0)
                sol-=a/pr;
            else
                sol+=a/pr;
        }
        fout<<a-sol<<"\n";
    }
}