Rezolvare completă PbInfo #1718 GenPascal

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.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema GenPascal:

#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;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1718 GenPascal

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1718 GenPascal de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!