# PBinfo #1718 – GenPascal – Rezolvare C++

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

## Enunț

Se consideră Triunghiul lui Pascal definit astfel: Primul rând conține numărul 1, iar celelalte numere se formează prin însumarea celor două numere de deasupra sa, considerând toate elementele din exteriorul triunghiului ca fiind egale cu 0.

Prin Triunghiul lui Pascal Generalizat se înțelege un triunghi care se formează la fel ca Triunghiul lui Pascal (fiecare număr se obține prin însumarea celor două numere de deasupra sa), numai că primul rând va fi considerat liber, iar cele două valori de pe al doilea rând vor fi precizate.

Cerința
Dându-se numerele naturale nenule n și m situate pe al doilea rând al Triunghiului lui Pascal Generalizat și un număr L, să se calculeze suma tuturor numerelor aflate pe linia L. 

Date de intrare
Fișierul de intrare genpascal.in conține pe prima linie numerele n și m,iar pe a doua linie numărul L.

Date de ieșire
Fișierul de ieșire genpascal.out va conține pe prima linie numărul S, reprezentând suma cerută.

Restricții și precizări

n,m ≤ 100
2 ≤ L ≤ 2000

Exemplu:
genpascal.in

1 2
6
genpascal.out

48
Explicație
Pentru valorile n = 1 și m = 2 se construiește următorul triunghi :

      X - rândul 1 este liber
     1 2 -rândul 2 cu valorile date
    1 3 2
   1 4 5 2
  1 5 9 7 2
 1 6 14 16 9 2 rândul cerut, 6.
Suma elementelor de pe rândul al șaselea este 48.

## Cod sursă C++

```cpp
#include <cstdio>
#include <fstream>
#define infile "genpascal.in"
#define outfile "genpascal.out"
using namespace std;
ofstream fout(outfile);
int main()
{
    freopen(infile,"r",stdin);
    int n,m,L;
    scanf("%d%d%d",&n,&m,&L);
    if(L==2) fout<<n+m;
    else if(L<=57)
    {
        // presupunând că n și m sunt maxim posibile, adică 100,
        // se observă că numărul maxim ce se poate obține fără operții cu numere mari este
        // 2^55 * (100+100) = 36028797018963968 * 200
        unsigned long long S=1;
        for(int i=1; i<=L-2; ++i) S*=2;
        fout<<S * (n + m);
    }
    else
    {
        unsigned long long S=1;
        for(int i=1; i<=55; ++i) S*=2;
        //numărul S îl descompunem în cifre în vector pentru a face operații cu numere mari
        int v[2000];
        v[0]=0;
        S*=(m+n);
        while(S)
        {
            v[++v[0]]=S%10;
            S/=10;
        }
        for(int k=58; k<=L; ++k)
        {
            // v * =2
            int T=0;
            for(int i=1; i<=v[0]; ++i)
            {
                v[i]=v[i]*2+T;
                T=v[i]/10;
                v[i]%=10;
            }
            while(T)
            {
                v[++v[0]]=T%10;
                T/=10;
            }
        }
        for(int i=v[0]; i>=1; --i) fout<<v[i];
    }
    fclose(stdin);
    fout.close();
    return 0;
}
```

## Resurse

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