Cod sursa(job #1921413)

Utilizator GinguIonutGinguIonut GinguIonut Data 10 martie 2017 12:36:06
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>

#define valMax 1000005
#define pMax 80001

using namespace std;

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

int t, prime[pMax], fact[pMax], viz[valMax], sol[pMax];
long long A, B, Sol;

void ciur()
{
    prime[++prime[0]]=2;
    for(int i=3; i<valMax; i+=2)
    {
        if(viz[i]==0)
        {
            prime[++prime[0]]=i;
            for(int j=i+i+i; j<valMax; j+=(i << 1))
                viz[j]=1;
        }
    }
}

void back(int k, long long prod, int nr)
{
    for(int i=sol[k-1]+1; i<=fact[0]; i++)
    {
        Sol+=1ll*nr*(A/(1ll*prod*fact[i]));
        sol[k]=i;
        back(k+1, 1ll*prod*fact[i], -nr);
    }
}

int main()
{

    ciur();
    fin>>t;
    while(t--)
    {
        fin>>A>>B;
        for(int i=1; i<=prime[0] && B!=1; i++)
        {
            if(B%prime[i]==0)
            {
                fact[++fact[0]]=prime[i];
                while(B%prime[i]==0)
                    B/=prime[i];
            }
            if(prime[i]*prime[i]>B && B>1)
            {
                fact[++fact[0]]=B;
                B=1;
            }
        }
        Sol=A;
        back(1, 1, -1);
        fout<<Sol<<'\n';
        fact[0]=Sol=0;
    }
}