Cod sursa(job #755664)

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


#define ll long long
#define max_p 1000005

ll M, A, B, fact[30];
int fprim[80000];
bool prim[max_p];

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

void sieve()
{
     fill(prim + 2, prim + max_p, true);
     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] = false;
             }
     }
}

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

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