Cod sursa(job #598060)

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

const int N=3099999;
long long d[N],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])
            for (int j=i*i;j<N;j+=i)
                c[j]=true;
    for (int i=2;i<N;i++)
        if (!c[i])
            prim[++prim[0]]=i;
}

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

int main()
{
    long long t,i;
    in>>t;
    ciur();
    while (t--)
    {
        in>>a>>b;
        rez=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=1;i<(1<<d[0]);i++)
            work(i);
        out<<a+rez<<"\n";
    }
    return 0;
}