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 naturale1≤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]); } }