Cod sursa(job #1639540)

Utilizator patrutoiuandreipatrutoiu andrei patrutoiuandrei Data 8 martie 2016 12:48:16
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>

using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");
long long A,B,nrdiv,M;
long long D[30];
void divizori_primi(long long nr)
{
    nrdiv = 0;
    for(int i=2;i*i<=nr;i++)
    {
        if(nr%i==0)
        {
            D[++nrdiv] = i;
            while(nr%i == 0)
                nr/=i;
        }
    }
    if(nr!=1)
        D[++nrdiv] = nr;
}
long long pinex(long long val)
{
    long long i,nr,j;
    long long prod,sol = A;
    for(i=1;i<=val;i++)
    {
        nr=0;prod = 1;
        for(j=0;j<nrdiv;j++)
        {
            if((1<<j)&i)
            {
                nr++;
                prod *= D[j+1];
            }
        }
        if(nr%2)
            nr = -1;
        else
            nr=1;
        sol = sol + nr * A/prod;
    }
    return sol;
}
int main()
{
    fin>>M;
    while(M--)
    {
        fin>>A>>B;
        divizori_primi(B);
        fout<<pinex((1<<nrdiv)-1)<<'\n';
    }
    return 0;
}