Cod sursa(job #598041)

Utilizator mihai995mihai995 mihai995 Data 24 iunie 2011 14:46:07
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
using namespace std;

const int N=1099999,M=16;
unsigned long long d[M],prim[N],a,b,rez;
bool c[N];

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

void ciur()
{
    c[0]=c[1]=true;
    for (int i=2;i*i<N;i++)
        if (!c[i])
        {
            prim[++prim[0]]=i;
            for (int j=i*i;j<N;j+=i)
                c[j]=true;
        }
}

void work(int x)
{
    unsigned long long val;
    int semn=1;
    for (int i=1;x;i++,x>>=1)
        if (x & 1)
        {
            semn=-semn;
            val*=d[i];
        }
    if (semn==1)
        rez+=val;
    else
        rez-=val;
}

int main()
{
    long long t,i;
    in>>t;
    ciur();
    while (t--)
    {
        in>>a>>b;
        rez=0;
        d[0]=0;
        for (i=1;prim[i]*prim[i]<=b && i<=prim[0];i++)
            if (b%prim[i]==0)
            {
                d[++d[0]]=prim[i];
                while (b%prim[i]==0)
                    b/=prim[i];
            }
        if (b!=1)
            d[++d[0]]=b;
        for (i=0;i<1<<d[0];i++)
            work(i);
        out<<rez<<"\n";
    }
    return 0;
}