# PBinfo #3311 – nrreg – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Numerele regulate sunt numerele ce au ca factori primi doar numerele 2, 3 și 5. Primele 20 de numere regulate sunt: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36.

Cerința
Fișierul de intrare nrreg.in conține pe prima linie numărul natural n (n<=10000). Scrieți un program care determină:


cel de-al n-lea număr regulat, x;
cel mai mic divizor d al lui x cu proprietatea că p = x / d este pătrat perfect;
valoarea p.

Programul va scrie în fișierul nrreg.out valorile x d p, separate prin câte spațiu.

Exemplu: dacă n=10, al zecelea număr regulat este x=12; d=3,  iar p=4. 

Date de intrare
Fișierul de intrare nrreg.in conține pe prima linie numărul natural n.

Date de ieșire
Fișierul de ieșire nrreg.out va conține pe prima linie numărul x d p, separate prin câte un spațiu.

Restricții și precizări

1 ≤ n ≤ 10000
prin convenție s-a stabilit că numărul 1 face parte din șirul numerelor regulate.

Exemplul 1:
nrreg.in

10
nrreg.out

12 3 4
Explicație
 Al zecelea număr regulat este 12; numărul minim care îl divide pe 12 pentru a obține un pătrat perfect este 3  iar pătratul perfect este 4.

Exemplul 2:
nrreg.in

5
nrreg.out

5 5 1
Explicație
 Al cincilea număr regulat este 5; numărul minim care îl divide pe 5 pentru a obține un pătrat perfect este 5  iar pătratul perfect este 1.

Exemplul 3:
nrreg.in

20
nrreg.out

36 1 36
Explicație
 Al douăzecilea număr regulat este 36; numărul minim care îl divide pe 36 pentru a obține un pătrat perfect este 1  iar pătratul perfect este 36.

## Cod sursă C++

```cpp
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
ifstream f("nrreg.in");
ofstream g("nrreg.out");
ull x, y, z, a = 2, b = 3, c = 5, ultim = 1;
ull mini(ull x, ull y, ull z)
{
    ull m=x;
    if(y<m)
        m=y;
    if(z<m)
        m=z;
    return m;
}
ull minim(ull n)
{
	ull k = 0, rez = 1;
	while (n%2 == 0)
	{
		k++;
		n /= 2;
	}
	if (k%2!=0)
		rez = rez * 2;
	for (ull i = 3; i * i <= n; i = i + 2)
	{
		k = 0;
		while (n%i == 0)
		{
			k++;
			n /= i;
		}
		if (k%2!=0)
			rez = rez * i;
	}
	if (n > 2)
		rez = rez * n;
	return rez;
}
int main()
{
    int n;
    f>>n;
    ull reg[n];
    reg[0] = 1;
    for (int i=1; i<n; i++)
    {
       ultim = mini(a, b, c);
       reg[i] = ultim;
       if (ultim == a)
           x++, a = reg[x]*2;
       if (ultim == b)
           y++, b = reg[y]*3;
       if (ultim == c)
           z++, c = reg[z]*5;
    }
    ull y=minim(ultim);
    g<<ultim<<' '<<y<<' '<<ultim/y;
    /*for(int i=1;i<n;i++)
        {
            g<<reg[i]<<' ';
            if(i%5==0)
                g<<endl;
        }*/
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3311)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3311/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3311/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
