Cod sursa(job #434242)

Utilizator hasegandaniHasegan Daniel hasegandani Data 5 aprilie 2010 14:44:39
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
#include<vector>
#include<bitset>

using namespace std;

#define plm long long
#define Max 1000005
#define pb push_back

plm A,B;
vector <plm> p,nr;
bitset <Max> e;

void ciur()
{
    for(plm i=2;i<Max;++i)
        if (!e[i])
            {
            for(plm j=i*i;j<Max;j+=i)
                e[j]=1;
            p.pb(i);
            }
}

void solve()
{
    int M,semn;
    plm prod,sum;
    nr.clear();
    vector<plm>::iterator it;

    M=0;
    for(it=p.begin(); it!=p.end() && (*it)*(*it) <= B ;++it)
        if (B%(*it)==0)
            {
            nr.pb(*it);
            ++M;
            for(; B%(*it)==0 ; B/=(*it));
            }
    if (B>1)
        {
        nr.pb(B);
        ++M;
        }

    sum=0;
    for(plm i=1;i<(1<<M);++i)
        {
        prod=1;
        semn=0;
        for(int j=0;j<M;++j)
            if (i&(1<<j))
                {
                semn^=1;
                prod*=(plm)nr[j];
                }
        if (semn)
            sum += (A/prod);
        else
            sum -= (A/prod);
        }
    printf("%lld\n",A-sum);
}

int main()
{
    int T;
    freopen("pinex.in","r",stdin);
    freopen("pinex.out","w",stdout);
    ciur();

    scanf("%d",&T);
    for(; T ;--T)
        {
        scanf("%lld",&A);
        scanf("%lld",&B);
        solve();
        }
    return 0;
}