Cod sursa(job #1567793)

Utilizator LurchssLaurentiu Duma Lurchss Data 13 ianuarie 2016 19:03:31
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>

#define maxim 1000005
using namespace std;

long long int A,B;
int m;
bitset<maxim> prim;
int nprim[105];
int factori[80005];

void descomp(int b);

void solve(int a,int b)
{
    descomp(b);
    int lmax=(1<<factori[0])-1;
    int s;
    int sum_one;
    int mm=0;
    for(int x=1;x<=lmax;x++)
    {
        s=1;
        sum_one=0;
        for(int i=1;i<=factori[0];i++)
            if(x & (1<< (i-1)))
                {s*=factori[i];
                    sum_one++;
                }
        if(sum_one%2==1)
            mm+=a/s;
        else mm-=a/s;
    }
    printf("%d\n",a-mm);
}

void descomp(int b)
{
    for(int i=1;i<=nprim[0] && nprim[i]<=b;i++)
        if(b%nprim[i]==0)
            {factori[++factori[0]]=nprim[i];
            while(b!=1 && b%nprim[i]==0)
                b/=nprim[i];
            }
    if(factori[0]==0)
        {
            nprim[++nprim[0]]=b;
            factori[++factori[0]]=b;
        }
}

void ciur()
{
    for(int i=2;i<=maxim;i+=2)
        prim[i]=1;
    nprim[++nprim[0]]=2;
    for(int i=3;i<=maxim;i+=2)
        if(prim[i]==0)
            {nprim[++nprim[0]]=i;
            for(int j=i;j<=maxim;j+=i)
                prim[j]=1;}
}
void read()
{
    scanf("%d ",&m);
    ciur();
    for(int i=1;i<=m;i++)
        {scanf("%d %d",&A,&B);
        factori[0]=0;
        solve(A,B);}
}

int main()
{
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    read();
    return 0;
}