Cod sursa(job #1567828)

Utilizator LurchssLaurentiu Duma Lurchss Data 13 ianuarie 2016 19:23:48
Problema Principiul includerii si excluderii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 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[80005];
long long int factori[105];

void descomp(long long int b);

void solve(long long int a,long long int b)
{
    descomp(b);
    int lmax=(1<<factori[0])-1;
    long long int s;
    int sum_one;
    long long 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;
    }
    if(b!=1)
        printf("%lld\n",a-mm);
    else printf("%lld\n",a);
}

void descomp(long long int b)
{
    for(int i=1;i<=nprim[0] && nprim[i]<=b && b!=1;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()
{
    nprim[++nprim[0]]=2;
    for(int i=3;i<=maxim;i+=2)
        if(prim[i]==0)
            {
                nprim[++nprim[0]]=i;
                for(int j=2*i;j<=maxim;j+=i)
                    prim[j]=1;
            }
}
void read()
{
    scanf("%d ",&m);
    ciur();
    for(int i=1;i<=m;i++)
        {
            scanf("%lld %lld",&A,&B);
            factori[0]=0;
            solve(A,B);
        }
}

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