fbpx

Problema #2241 – inspectorat – Rezolvari PBInfo

de Mihai-Alexandru

Inspectoratul școlar județean organizează un concurs pentru ocuparea strategicului post de fochist. La proba de informatică, cea mai importantă a concursului, candidații au de rezolvat următoarea problemă.

Cerința

Se dau n perechi de numere naturale și pentru fiecare pereche (x,y) trebuie să se afle câte numere naturale nenule strict mai mici decât produsul x * y sunt prime cu x * y.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n perechi de numere naturale x și y.

Date de ieșire

Programul va afișa pe ecran, pentru fiecare pereche (x, y) valoarea cerută, urmată de enter.

Restricții și precizări

  • 1 ≤ n ≤ 10 000
  • Pentru fiecare pereche (x, y), 2 ≤ x, y ≤ 200 000
  • Două numere sunt prime între ele dacă cel mai mare divizor al lor este 1.
  • Atenție, produsul a două numere poate depăși valoarea maximă admisă de tipul int.
  • Această ultimă precizare este disponibilă numai inspectorilor.

Exemplu

Intrare

3
3 4
3 3
97 33

Ieșire

4
6
1920

Explicație

Pentru prima pereche: 3 * 4 = 12, iar 12 este prim cu patru numere: 1, 5, 7, 11. Pentru a doua pereche: 3 * 3 = 9, iar 9 este prim cu șase numere: 1, 2, 4, 5, 7, 8. Pentru a treia pereche: puteți verifica și singuri că așa este. Oricum, inspectorii nu greșesc niciodată.

#include <bits/stdc++.h>
using namespace std;

long long n , x , y;

long long Phi(long long n)
{
    long long r = n , d = 2;
    while(n > 1)
    {
        if(n % d == 0)
        {
            r = r / d * (d - 1);
            while(n % d == 0)n /= d;
        }
        d++;
        if(d * d > n)d = n;
    }
    return r;
}

int cmmdc(long long a , long long b)
{
    long long r;
    while(b != 0) r = a % b , a = b , b = r;
    return a;
}

int main()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> x >> y;
        int d = cmmdc(x , y);
        cout << Phi(x) * Phi(y) * d / Phi(d) << '\n';
    }
}
Comentarii

S-ar putea sa iti placa