Cod sursa(job #2158333)

Utilizator ana.pintiliciucAna Maria Pintiliciuc ana.pintiliciuc Data 10 martie 2018 12:04:42
Problema Principiul includerii si excluderii Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>

using namespace std;

int n, a, b, d[100500], k;
bool c[1000005];

void ciur()
{
    for(int i=2;i<=1000000;i++)
        if(c[i]==0)
            for(int j=i+i;j<=1000000;j+=i)
                c[j]=1;
}

void diviz()
{
    int i=3;
    k=0;
    if(b%2==0)
    {
        d[k++]=2;
        while(b%2==0)
            b/=2;
    }

    for(i;i*i<b;i++)
    {
        if(c[i]==0)
            if(b%i==0)
            {
                while(b%i==0)
                    b/=i;
                d[k++]=i;
            }
    }
    if(b!=1)
        d[k++]=b;
}

void zero()
{
    for(int j=0;j<k;j++)
    {
        d[j]=0;
    }
}

int subsir()
{
    int m=1<<k;
    int s=0;
    for(int i=1;i<m;i++)
    {
        int p=1;
        int nr=0;
        for(int j=0;j<k;j++)
        {
            if((i&(1<<j))!=0)
            {
                p*=d[j];
                nr++;
            }
        }
        if(nr%2==0)
            s-=(a/p);
        else s+=(a/p);
    }
    return s;
}

int main()
{
    freopen("pinex.in", "r", stdin);
    freopen("pinex.out", "w", stdout);
    scanf("%d", &n);
    ciur();
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d", &a, &b);
        diviz();
        printf("%d", a-subsir());
        /**for(int j=1;j<=d[0];j++)
        {
            printf("%d ", d[j]);
        }**/
        zero();
        printf("\n");
    }


    return 0;
}