Cod sursa(job #1778679)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 13 octombrie 2016 23:16:39
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>

using namespace std;

const int NMAX=1000000;

char vaz[NMAX+3];
int prim[NMAX];
int v[NMAX];

int main()
{
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    int m,l=0,l1,c;
    long long a,b,p,s;
    scanf("%d",&m);
    for(int i=2;i<=NMAX;i++)
        if(vaz[i]==0)
        {
            l++;
            prim[l]=i;
            for(long long j=1LL*i*i;j<=NMAX;j=j+i)
                vaz[j]=1;
        }
    for(int i=1;i<=m;i++)
    {
        scanf("%lld%lld",&a,&b);
        c=b;l1=0;s=0;
        for(int j=1;j<=l;j++)
            if(c%prim[j]==0)
            {
                    l1++;v[l1]=prim[j];
                    while(c%prim[j]==0) c=c/prim[j];
                    if(c==1) break;
            }
        if(c>1) {l1++;v[l1]=c;}
        for(int j=1;j<=(1<<l1);j++)
        {
            c=0;p=1;
            for(int k=0;k<l1;k++)
                if(j&(1<<k)) {c++;p=p*v[k+1];}
            if(c>0)
            {
                if(c%2==1) s=s+a/p;
                else s=s-a/p;
            }
        }
        printf("%lld\n",a-s);
        for(int j=1;j<=l1;j++) v[j]=0;
    }
    return 0;
}