# PBinfo #1356 – nsir – Rezolvare C++

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

## Enunț

Cerința
Fie n un număr natural. 
Să se determine  toate șirurile a de k numere naturale nu neapărat distincte: 1 ≤ a1, a2,...,ak  ≤ n, astfel încât: 
1) 1 = 1/a1+ 1/a2+...+ 1/ak
2) n = a1 + a2 +...+ ak

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

Date de ieșire
Fișierul de ieșire nsir.out va conține pe fiecare linie câte un șir determinat, în ordine lexicografică. Dacă nu poate fi generat un astfel de șir, atunci se va scrie valoarea 0 pe prima linie a fișierului de ieșire.

Restricții și precizări

5 ≤ n ≤ 75
se admite că cerința 1) este satisfăcută dacă:  | 1/a1 + 1/a2 + … + 1/ak – 1 |<10-5

Exemplu:
nsir.in

33
nsir.out

3 3 9 9 9
3 5 5 5 15
Explicație
Se observă că
1) 1 = 1/3+1/3+1/9+1/9+1/9 și 33 = 3+3+9+9+9
2) 1 = 1/3+1/5+1/5+1/5+1/15 și 33 = 3+5+5+5+15

## Cod sursă C++

```cpp
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("nsir.in");
ofstream g("nsir.out");
int st[101], n, ex=0;
double eps=0.00001;
void scrie(int k)
{
    ex=1;
    for(int i=1;i<=k;i++)
        g<<st[i]<<" ";
    g<<endl;
 }
int suma1(int k)
{
    int i, s=0;
    for(i=1;i<=k;i++)
        s+=st[i];
    return s;
}
float suma2(int k)
{
    int i;
    float s=0;
    for(i=1;i<=k;i++)
        s+=1./st[i];
    return s;
}
int validare(int k)
{
    if(k==1)return 1;
    if(suma1(k)>n || (suma2(k)>1+eps)) return 0;
    return 1;
}
void back(int k)
{
    if(k<=n)
    {
        if( (suma1(k-1)==n) && (fabs(1-suma2(k-1))<eps) )
        {
            ex=1; scrie(k-1);
        }
        else
        {
            for(st[k]=st[k-1]; st[k]<=n; st[k]++)
                 if (validare(k)==1)back(k+1);
        }
    }
}
int main()
{
    f>>n;
    back(1);
    if(ex==0)g<<0<<endl;
    return 0;
}
```

## Resurse

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