fbpx

Problema #1091 – Expozitie – Rezolvari PBInfo

de Mihai-Alexandru

Ilinca este o fetiţă căreia îi place foarte mult să deseneze; ea a făcut multe desene pe care le-a numerotat de la 1 la d şi apoi le-a multiplicat (toate copiile poartă acelaşi număr ca şi originalul după care au fost făcute). În vacanţă s-a hotărât să-şi deschidă propria expoziţie pe gardul bunicilor care are mai multe scânduri; pe fiecare scândură ea aşează o planşă (un desen original sau o copie). Ilinca ţine foarte mult la desenele ei şi doreşte ca fiecare desen să apară de cel puţin k ori (folosind originalul şi copiile acestuia). Ilinca se întreabă în câte moduri ar putea aranja expoziţia. Două moduri de aranjare sunt considerate distincte dacă diferă cel puţin prin numărul unei planşe (de exemplu: 2 1 3 3 este aceeaşi expoziţie ca şi  2 3 1 3, dar este diferită de 2 1 3 1 şi de 1 3 3 1).

Cerinţă

Cunoscând n numărul de scânduri din gard, d numărul desenelor originale şi k numărul minim de apariţii al fiecărui desen, să se determine în câte moduri poate fi aranjată expoziţia, ştiind că Ilinca are la dispoziţie oricâte copii doreşte.

Date de intrare

Fișierul de intrare expozitie.in conține 3 numere n d k – numărul de scânduri, numărul desenelor originale, respectiv numărul minim de aparţii

Date de ieșire

Fișierul de ieșire expozitie.out va conține un singur număr nr – numărul modurilor distincte de aranjare a expoziţiei

Restricții și precizări

  • n, k, d sunt numere naturale
  • 1≤n≤500
  • 1≤d≤500
  • 0≤k≤n

Exemplu

expozitie.in

 3 2 1

expozitie.out

2

Explicație

Sunt 3 scânduri, 2 desene originale şi fiecare desen trebuie să apară cel puţin o data. Există 2 moduri de aranjare. Planşele ar putea fi aşezate astfel:
1 2 1
1 2 2

#include <bits/stdc++.h>



using namespace std;

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

struct numarmare
{
    int n;
    char c[201];
}a[505][505];
int n , k , d;

void aduna(numarmare A , numarmare B , numarmare &S)///s = a + b
{
    int i , t = 0 , c , p;
    if(A.n < B.n)
    {
        p = B.n;///nr max de cifre
        //for(int i =  A.n + 1 ; i <= B.n ; i++) A.c[i] = 0;///completez cu 0
    }
    else
    {
        p = A.n;
        //for(int i =  B.n + 1 ; i <= A.n ; i++) B.c[i] = 0;
    }
    for(int i = 1 ; i <= p ; i++)
    {
        c = A.c[i] + B.c[i] + t;
        S.c[i] = c % 10;
        t = c / 10;
    }
    if(t == 1)
    {
        p++;
        S.c[p] = t;
    }
    S.n = p;
}

void afisare(numarmare A)
{
    for(int i = A.n ; i >= 1 ; i--) cout << (int)A.c[i];
}
int main()
{
    cin >> n >> d >> k;
    ///combinari de d + r - 1 cate r
    int r = n - k * d , m;
    if(r < 0) cout << 0;
    else if(r == 0) cout << 1;
    else
    {
        m = r + d - 1;
        a[0][0].n = 1;
        a[0][0].c[1] = 1;
        for(int i = 1 ; i <= m ; i++)
        {
            for(int j = 0 ; j <= m ; j++)
                if(j == 0) a[i][j].n = 1 , a[i][j].c[1] = 1;
                else aduna(a[i-1][j-1] , a[i-1][j] , a[i][j]);
        }
        afisare(a[m][r]);
    }
}
Comentarii

S-ar putea sa iti placa