Cod sursa(job #1549436)

Utilizator akaprosAna Kapros akapros Data 12 decembrie 2015 12:29:07
Problema Principiul includerii si excluderii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define maxN 102
#define maxV 1000
#define ll long long
using namespace std;
int n, m;
ll a, b, sol, d[maxN];
bool w[maxV];
int p[maxV / 9];
void primes()
{
   int i, j;
   w[1] = 1;
   for (i = 2; i <= maxV; ++ i)
      if (!w[i])
      {p[++ p[0]] = i;
      for (j = i * i; j <= maxV; j += i)
          w[j] = 1;
    }
  }
void desc(int x)
{
   int i;
   sol = a - 1;
   d[0] = 0;
   for (i = 1; p[i] * p[i] * 1LL <= x; ++ i)
       if (x % p[i] == 0)
    {
        while (x % p[i] == 0)
              x /= p[i];
        d[++ d[0]] = p[i];
    }
    if (x != 1LL)
    {
        d[++ d[0]] = x;
    }
}
void solve()
{
   int i, j, nb1;
   ll p;
   desc(b);
   for (i = 1; i < (1 << d[0]); ++ i)
   {
       nb1 = 0;
       p = 1LL;
       for (j = 0; j < d[0]; ++ j)
           if (i & (1 << j))
        {
            ++ nb1;
            p *= d[j + 1];
        }
        if (nb1 % 2)
           sol -= ((a - 1) / p);
        else
           sol += ((a - 1) / p);
   }
}
void write()
{
   printf("%lld\n", sol);
}
void rsw()
{
    freopen("pinex.in", "r", stdin);
    freopen("pinex.out", "w", stdout);
    scanf("%d", &m);
    primes();
    while (m --)
    {
        scanf("%lld %lld", &a, &b);
        solve();
        write();
    }
}
int main()
{
    rsw();
    return 0;
}