# PBinfo #4496 – Cerc_nm – Rezolvare C++

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

## Enunț

Cerinţa
Se dau două numere naturale n și m. Determinati o modalitate alegere a m numere din mulțimea \({1,2,…,n}\) și de așezare a lor pe un cerc astfel încât suma a oricare două numere învecinate să fie pătrat perfect.

Date de intrare
Programul citește de la tastatură numerele n și m.

Date de ieșire
Programul va afișa pe ecran cele m numere cerute, separate prin câte un spațiu.

Restricții și precizări

1 ≤ m ≤ n ≤ 100
dacă există mai multe modalități de aranjare a numerelor astfel încât să fie îndeplinită condiția, se va afișa cea mai mică lexicografic;
dacă nu există nicio modalitate de aranjare, atunci se va afișa mesajul nu exista

Exemplu:
Intrare

35 6
Ieșire

1 3 6 19 17 8 
Explicație
1 + 3 = 4 (pătrat perfect)
3 + 6 = 9 (pătrat perfect)
6 + 19 = 25 (pătrat perfect)
19 + 17 = 36 (pătrat perfect)
8 + 1 = 9 (pătrat perfect)

## Cod sursă C++

```cpp
#include <iostream>
#include <cmath>
using namespace std;
int n,X[101],P[101],gata,m;
void afisare()
{
    for(int i=1;i<=m;i++)
        cout<<X[i]<<" ";
    gata=1;
}
void back(int k)
{
    for(int i=1;i<=n && !gata;i++)
        if(!P[i])
        {
            X[k]=i;
            P[i]=1;
            if(k==1 || sqrt(X[k]+X[k-1])==floor(sqrt(X[k]+X[k-1])))
            {
                if(k==m)
                {
                    if(sqrt(X[1]+X[m])==floor(sqrt(X[1]+X[m]))) afisare();
                }
                else back(k+1);
            }
            P[i]=0;
        }
}
int main()
{
    cin>>n>>m;
    back(1);
    if(!gata) cout<<"nu exista";
    return 0;
}
```

## Resurse

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