Cod sursa(job #1465194)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 26 iulie 2015 18:11:06
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<cstdio>
using namespace std;
char ciur[1000010];
long long prime[80000],div[30];
void ciurr(long long nrmax){
    long long prim=2,m;
    while(prim*prim<=nrmax){
        for(m=prim;m<=nrmax/prim;m++)
            ciur[m*prim]=1;
        prim++;
        while(ciur[prim]==1)
            prim++;
    }
    for(m=2;m<=nrmax;m++)
        if(ciur[m]==0){
            prime[0]++;
            prime[prime[0]]=m;
        }
}
int main (){
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    long long n,i,b,j,nr,q;
    long long a,p,sol;
    scanf("%d",&n);
    ciurr(1000000);
    for(q=1;q<=n;q++){
        scanf("%lld%lld",&a,&b);
        div[0]=0;
        for(i=1;prime[i]*prime[i]<=b&&i<=prime[0];i++)
            if(b%prime[i]==0){
                div[0]++;
                div[div[0]]=prime[i];
                while(b%prime[i]==0)
                    b/=prime[i];
            }
        if(b!=1){
            div[0]++;
            div[div[0]]=b;
        }
        sol=0;
        for(i=1;i<(1<<div[0]);i++){
            nr=0;
            p=1;
            for(j=0;j<div[0];j++)
                if((1<<j)&i){
                    p=1LL*p*div[j+1];
                    nr++;
                }
            if(nr%2==1)
                nr=1;
            else
                nr=-1;
            sol=sol+1LL*nr*(a/p);
        }
        sol=a-sol;
        printf("%lld\n",sol);
    }
    return 0;
}