Cerința
Lui Ionci ii place foarte mult matematica si informatica, asa ca s-a gandit sa creeze o operatie. Aceasta a numit-o "Happy", notata cu semnul ☺. Operatia se aplica doar numerelor naturale si dau ca rezultat tot un numar natural, conform exemplelor de mai jos:
2010 ☺ 2005 = 578 ☺ 54 = 6999 ☺ 543 = 34 ☺ 9 = 15 ☺ 6 = 132 ☺ 24 = 810 ☺ 2 = 2
Profesorul de matematica, Vasy, i-a promis nota 10 pe invenție dacă pentru mai multe perechi de numere naturale veți determina cel mai mic număr rezultat cu număr par de divizori al operației Happy aplicată perechilor date și cel mai mare număr rezultat al operației Happy cu număr impar de divizori.
Date de intrare
Programul citește un număr natural N și N perechi de numere naturale a b.
Date de ieșire
Programul va afișa cel mai mic și cel mai mare rezultat obținut prin operația de mai sus, cu număr par, respectiv impar de divizori, separate printr-un spațiu. Dacă nu exista rezultate care au numărul de divizori par sau numărul de divizori impar, se va afișa mesajul NU EXISTA.
Restricții și precizări
1 ≤ N ≤ 20- cele
2 * Nnumere citite vor fi nenule și mai mici decât1.000.000.
Exemplu
Intrare
2 87 87 1 1
Ieșire
87 1
Explicație
- rezultatul operației aplicate numerelor
87și87este87, iar numerelor1și1este1. Numărul87are4divizori iar numărul1are1divizor. Deci87este cel mai mare număr cu număr de divizori par și1cel mai mic număr cu numărul de divizori impar.
#include <bits/stdc++.h>
using namespace std;
int cmmdc(int a,int b)
{
int r,d;
while(b!=0)
{
r=a%b;
a=b;
b=r;
}
d=a;
return d;
}
int nrdiv(int n)
{
int cnt=0;
for(int i=1;i*i<=n;i++)
{
if(n%i==0) cnt += 2;
if(i*i==n) cnt--;
}
return cnt;
}
int main()
{
int n,a,b,minim=1000000,maxim=-1;
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>a>>b;
int d=cmmdc(a,b);
if(nrdiv(d)%2==0)
{
if(d<minim) minim=d;
}
else
if(nrdiv(d)%2==1)
{
if(d>maxim) maxim=d;
}
}
if(maxim==-1 || minim==1000000) cout<<"NU EXISTA";
else
cout<<minim << " "<<maxim;
return 0;
}