Cod sursa(job #1108648)

Utilizator addy01adrian dumitrache addy01 Data 15 februarie 2014 21:51:23
Problema Principiul includerii si excluderii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#define maxn 1000010
using namespace std;
ifstream in ("pinex.in");
ofstream out("pinex.out");

bool c[maxn];
int prime[maxn],ct;
long long sol;
void ciur()
{
    int i,j;
    c[0]=1;
    c[1]=1;

    for(i=3;i*i<maxn;i+=2)
        if(c[i]==0)
            for(j=i*i;j<maxn;j=j+2*i)
                c[j]=1;
prime[++ct]=2;
      for(i=3;i<maxn;i+=2)
        if(c[i]==0)
            prime[++ct]=i;
}


void solve(long long a, long long b)
{
    int div[20],j=1,i;
    for(i=1;i<=ct&&prime[i]*prime[i]<=b&&b>1;i++)
        if(b%prime[i]==0)
        {
            while(b%prime[i]==0)
                b=b/prime[i];
            div[j]=prime[i];
            ++j;

        }
        if(b>1)
            div[j++]=b;



        long long it;

    long long lev,prod,k;
    for (it = 1; it < (1LL << (j-1)); it ++){
        lev = 0;
        prod = 1;

        for (k = 0; k < j-1; k ++)
            if (it & (1 << k))
                prod *= 1LL * (long long) div[k+1], lev ++;

        if (lev & 1)
            sol+=(a / prod);
        else
            sol-=(a / prod);
    }

sol=a-sol;
    out<<0LL+sol<<"\n";
}


int main()
{
    int t;
    long long a,b;
    in>>t;
    ciur();
    while(t--)
    {
        in>>a>>b;
        sol=0;
        solve(a,b);
    }
    return 0;
}