Cod sursa(job #977733)

Utilizator thewildnathNathan Wildenberg thewildnath Data 26 iulie 2013 15:12:19
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#include<math.h>

long long div[20],a,b,c[20],s,h=1;
int nrd;

void desc()
{
    int i,m;
    nrd=0;
    if(b%2==0)
    {
        while(b%2==0)
            b/=2;
        div[++nrd]=2;
    }
    m=sqrt(b);
    for(i=3;i<=m;i+=2)
    {
        if(b%i==0)
        {
            while(b%i==0)
                b/=i;
            div[++nrd]=i;
            if(b==1)
                break;
        }
    }
    if(b>1)
        div[++nrd]=b;
}

void back(int x,int p)
{
    int i;
    if(p>1)
    {
        if(p%2==0)
            s+=a/h;
        else
            s-=a/h;
    }
    for(i=x+1;i<=nrd;++i)
    {
        c[p]=div[i];
        h*=div[i];
        back(i,p+1);
        h/=div[i];
    }
}

int main()
{
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld",&a,&b);
        desc();
        s=0;
        back(0,1);
        printf("%d\n",a-s);
    }
    return 0;
}