Cod sursa(job #664643)

Utilizator sanzianaioneteIonete Sanziana sanzianaionete Data 20 ianuarie 2012 15:55:12
Problema Principiul includerii si excluderii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<cstdio>
#include<math.h>
using namespace std;
int m,d,nd,i,j,k,n,p,x,nrp[500001];
long long b,a,s,div[100100];
bool prim[1000001];
void divizori(long long n)
{
    int t=1;
    while(nrp[t]<=d)
    {
        if(n%nrp[t]==0)
        {
            nd++;
            div[nd]=nrp[t];
            while(n%nrp[t]==0) n=n/nrp[t];
        }
        t++;
    }
    if(n>1)
    {
        nd++;
        div[nd]=n;
    }
}
int main()
{
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
	k=1;nrp[1]=2;
    for (i=3; i<1000000; i+=2)
        if (!prim[i])
        {
            k++;
            nrp[k]=i;
            j=3*i;
            while(j<1000000)
            {
                prim[j]=true;
                j=j+2*i;
            }
        }
    scanf("%d\n",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%lld %lld\n",&a,&b);
        nd=0;s=a;d=floor(sqrt(b));
        divizori(b);
        for(j=1;j<1<<nd;j++)
        {
            p=1;x=j;n=0;
            for(k=1;k<=nd;k++)
            {
                if(x%2==1)
                {
                    p=p*div[k];
                    n++;
                }
                x=x/2;
            }
            if(n%2==1) s=s-a/p;
            else s=s+a/p;
        }
        printf("%lld\n",s);
    }
    fclose(stdin);fclose(stdout);
    return 0;
}