Cod sursa(job #1339757)

Utilizator Vlad_317Vlad Panait Vlad_317 Data 11 februarie 2015 09:31:30
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>

using namespace std;

#define MAX 100000

bool ciur[MAX+1];
int v[MAX+1],nrp=0;

int p[200],k=0;

void genPrimes()
{
    long long i,j;
    for(i=2;i<=MAX;i++)
        if(ciur[i]==0)
        {
            v[++nrp]=i;
            for(j=i*i;j<=MAX;j+=i)
                ciur[j]=1;
        }
}

int sol(int a, int b)
{
    int i=v[1],nr=1
    long long prod=1,s=0;

    k=0;
    while(b!=1)
    {
        if(b%i==0)
        {
            while(b%i==0)
                b/=i;
            p[k++]=i;
        }
        i=v[++nr];
    }

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

int main()
{
    FILE *fin,*fout;

    fin=fopen("pinex.in","r");
    fout=fopen("pinex.out","w");

    genPrimes();

    int m,i;

    fscanf(fin,"%d",&m);

    for(i=1;i<=m;i++)
    {
        int a,b;
        fscanf(fin,"%d%d",&a,&b);
        fprintf(fout,"%d\n",sol(a,b));
    }

    return 0;
}