Cod sursa(job #755668)

Utilizator visanrVisan Radu visanr Data 6 iunie 2012 18:11:25
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstring>
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;


#define ll long long

ll M, A, B;
int fprim[500005], fact[1000];
bool prim[1000005];

ifstream in("pinex.in");
ofstream out("pinex.out");

void sieve()
{
     for(int i = 2; i < max_p; i++)
     {
             if(!prim[i])
             {
                        fprim[++fprim[0]] = i;
                        for(int j = i + i; j < max_p; j += i) prim[j] = true;
             }
     }
}

void solve()
{
     ll d = 0, t = 0, pp, prod, nr;
     while(B > 1)
     {
             ++d;
             if(B % fprim[d] == 0)
             {
                  fact[++t] = fprim[d];
                  while(B % fprim[d] == 0) B /= fprim[d];
             }
             if(fprim[d] * fprim[d] > B && B > 1)
             {
                         fact[++t] = B;
                         B = 1;
             }
     }
     ll sol = 0;
     for(int i = 1; i < (1 << t); i++)
     {
             prod = 1, nr = 0;
             for(int j = 0; j < t; j++)
             {
                     if(i & (1 << j))
                     {
                          prod *= fact[j + 1];
                          nr++;
                     }
             }
             pp = A / prod;
             if(nr & 1) sol += pp;
             else sol -= pp;
     }
     out << A - sol << "\n";
}

int main()
{
    int i;
    sieve();
    in >> M;
    for(i = 0; i < M; i++)
    {
          in >> A >> B;
          solve();
    }
    return 0;
}