Cod sursa(job #1977869)

Utilizator victoreVictor Popa victore Data 6 mai 2017 13:01:01
Problema Principiul includerii si excluderii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<cstdio>

const int nmax=1e6+5;

long long  div[nmax],prime[nmax],nrpr,top,sol,nr,i,j,a,b,prod;
bool ciur[nmax];
int t;
int main()
{
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    ciur[1]=1;
    for(i=2;i<=100;i++)
    {
        if(!ciur[i])
        {
            prime[++nrpr]=i;
            for(j=i;j<=nmax;j+=i)
                ciur[j]=1;
        }
    }
    scanf("%d",&t);
    while(t)
    {
        sol=top=0;
        scanf("%lld%lld",&a,&b);
        if(b==0)
        {
            printf("%lld/n",a);
            continue;
        }
        if(a==0)
        {
            printf("0\n");
            continue;
        }
        for(i=1;prime[i]*prime[i]<=b;i++)
        {
            if(!(b%prime[i]))
            {
                div[++top]=prime[i];
                while(!(b%prime[i]))
                    b/=prime[i];
            }
        }
        if(b!=1)
            div[++top]=b;
        for(i=1;i<(1<<top);i++)
        {
            nr=0;
            prod=1;
            for(j=0;j<top;j++)
            {
                if(((1<<j)&i)!=0)
                {
                    nr++;
                    prod*=div[j+1];
                }
            }
            if(nr%2)
                nr=1;
            else
                nr=-1;
            sol+=1LL*nr*(a/prod);
        }
        printf("%lld\n",a-sol);
        t--;
    }
}