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';
}
}