Cod sursa(job #1082812)

Utilizator binicBinica Nicolae binic Data 14 ianuarie 2014 22:17:37
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<stdio.h>
#include<cmath>
using namespace std;
int z,qw[78500];
long long n,i,c,b,k,x,d,pr,t,s,w,j,p,q,r,o,h,a[100000];
bool p1[1000001];
int main ()
{
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    scanf("%lld\n",&n);
    p1[1]=1;
    p1[2]=0;
    q=1;
    qw[1]=2;
    for(i=3;i<=1000001;i+=2)
    {
        if(p1[i]==0)
        {
            q++;
            qw[q]=i;
            if(z==0)
            {
                for(j=i*i;j<=1000001;j+=i)
                {
                    p1[j]=1;
                }
                if((i+2)*(i+2)>1000001)z=1;
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        scanf("%lld %lld",&c,&b);
        k=0;
        s=0;
        x=b;
        d=1;
        while(x>1)
        {
            p=0;
            if(x%qw[d]==0)
            {
                k++;
                a[k]=qw[d];
                while(x%qw[d]==0)x=x/qw[d];
            }
            if(d>sqrt(x)&&x>1)
            {
                k++;
                a[k]=x;
                x=1;
            }
            d++;
        }
        t=k;
        s=c;
        for(j=1;j<(1<<t);j++)
        {
            p=1;
            w=0;
            for(o=0;o<t;o++)
                if((1<<o)&j)
                {
                    w++;
                    p=1LL*p*a[o+1];
                }
            if(w%2==1)w=-1;
            else w=1;
            if(p>0)s=s+w*c/p;
        }
        printf("%lld\n",s);
    }
    return 0;
}