Cod sursa(job #1228858)

Utilizator george_stelianChichirim George george_stelian Data 15 septembrie 2014 18:01:40
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#define limciur 1000000

using namespace std;

int t;
long long nrp[500000],v[100],a,b,i,j,nr,sol,x,y,lim,rez;
char ciur[1000010];

int main()
{
    freopen("pinex.in", "r", stdin);
    freopen("pinex.out", "w", stdout);
    for(i=2;i<=limciur;i++)
        if(!ciur[i])
        {
            nrp[++nr]=i;
            for(j=i*i;j<=limciur;j+=i) ciur[j]=1;
        }
    for(scanf("%d",&t);t;t--)
    {
        scanf("%lld%lld",&a,&b);
        sol=0;
        for(i=1;i<=nr && nrp[i]*nrp[i]<=b;i++)
            if(b%nrp[i]==0)
            {
                while(b%nrp[i]==0) b/=nrp[i];
                v[++sol]=nrp[i];
            }
        if(b>1) v[++sol]=b;
        lim=(1<<sol)-1;
        rez=0;
        for(i=1;i<=lim;i++)
        {
            x=1;y=0;
            for(j=1;j<=sol;j++)
                if(i&(1<<(j-1)))
                {
                    x*=v[j];
                    y++;
                }
            if(y%2) rez+=a/x;
            else rez-=a/x;
        }
        printf("%lld\n",a-rez);
    }
    return 0;
}