269
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
100cifre. - 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