Rezolvare completă PbInfo #1091 Expozitie

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

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 Expozitie:

#include<fstream>
#define LgNr 500
using namespace std;
typedef int BIG[LgNr];
int n,d,m,i,j,k,r,q,aux;
BIG Lc[501],Lp[501];
void sum(BIG a, BIG b, BIG & s)
{  
    int i,cifra,t = 0,max;
    if(a[0] < b[0]) 
    { 
        max=b[0]; 
        for(i=a[0]+1;i<=b[0];i++)
             a[i] = 0;
     }
    else
        {
      max=a[0];
      for(i=b[0]+1;i<=a[0];i++)
         b[i]=0;
    }
   
    for(i=1;i<=max;i++)
    {
      cifra=a[i]+b[i]+t; 
      s[i]=cifra%10;     
      t=cifra/10;            
    }
    if(t)s[i]=t;
    else i--;
    s[0]=i;    
      
}
int main()
{
    ifstream fin("expozitie.in");
    ofstream fout("expozitie.out");
    
    fin>>n>>d>>k;
    r=n-k*d;
    if(r<0)fout<<0;
    else
    if(r==0)fout<<1;
    else
    { 
    m=r+d-1;
    for(i=1;i<=r;i++)
            Lp[i][0]=Lp[i][1]=1;
    for(i=2;i<=d;i++)
    {   
        
        aux=i;Lc[1][0]=0;
        while(aux)
            {
            Lc[1][0]++;
            Lc[1][Lc[1][0]]=aux%10;
            aux=aux/10;
            }
        for(j=2;j<=r;j++)
            sum(Lp[j],Lc[j-1],Lc[j]);
        for(j=0;j<=r;j++)
            for(q=0;q<=Lc[j][0];q++)
                Lp[j][q]=Lc[j][q];
    }
    for(j=Lc[r][0];j>=1;j--)
        fout<<Lc[r][j];
    }   
    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 #1091 Expozitie

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1091 Expozitie 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!