fbpx

Problema #2449 – PM – Rezolvari PBInfo

de Mihai-Alexandru

Vom numi secvenţă PM o succesiune formată din plus şi minus, care NU conţine două semne minus alăturate.

Vom numi secvenţă PM o succesiune formată din plus şi minus, care NU conţine două semne minus alăturate.
De exemplu, există 5 secvenţe PM de lungime 3 : + + + , + + – , + – + , – + + , – + -.

Cerința

Să se determine numărul de secvenţe PM care conţin x semne plus şi y semne minus.

Date de intrare

Fişierul de intrare pm.in conţine pe prima linie două numere naturale separate prin spaţiu x , y, cu semnificaţia din enunţ.

Date de ieșire

Fişierul de ieşire pm.out va conţine o singură linie pe care va fi scris un singur număr natural, reprezentând numărul de secvenţe PM care conţin x semne plus şi y semne minus.

Restricții și precizări

  • 0 ≤ y ≤ x ≤ 250
  • Rezultatul va avea maxim 100 cifre.
  • Pentru 50% din testele de evaluare x < 32.
  • 10% din punctaj se va acorda pe exemple.

Exemplu 1:

pm.in

2 1

pm.out

3

Exemplu 2:

pm.in

4 2

pm.out

10
#include <bits/stdc++.h>
using namespace std;

ifstream cin("pm.in");
ofstream cout("pm.out");

struct bigint
{
    int n , c[101];
}a[256] , b[256];

bigint aduna(bigint a , bigint b)
{
    bigint s = {0 , {0}};
    s.n = max(a.n , b.n);
    int t = 0;
    for(int i = 1 ; i <= s.n ; i++)
    {
        int cc = a.c[i] + b.c[i] + t;
        s.c[i] = cc % 10;
        t = cc / 10;
    }
    if(t > 0)
    {
        s.n++;
        s.c[s.n] = t;
    }
    return s;
}

void afisare(bigint a)
{
    for(int i = a.n ; i >= 1 ; i--)
        cout << a.c[i];
}

int main()
{
    int x , y;
    cin >> x >> y;
    for(int i = 1 ; i <= x + 1 ; i++)
    {
        for(int j = 0 ; j <= i ; j++)
            if(j == 0 || i == j) b[j] = {1 , {0 , 1}};
            else b[j] = aduna(a[j - 1] , a[j]);
        for(int j = 0 ; j <= i ; j++)
            a[j] = b[j];
    }
    afisare(a[y]);
}
Comentarii

S-ar putea sa iti placa