



program pyragaiciai ;


const 
   MAX_N = 30 ;
   
type 
  TPirkinys = array [ 1 .. MAX_N ] of integer ;

var
  rezF : text ;

  N : integer ;
  K : integer ;
  pyragParduotuveje : array [ 1 .. MAX_N ] of integer ;
  
  procedure ivestiPradDuomenis( prDuomFV: string ) ;
    var 
     prDuomF : text ;
     i : integer ;
  begin
    assign( prDuomF, prDuomFV ) ;

    reset( prDuomF ) ;
    readln( prDuomF, K ) ;
    readln( prDuomF, N ) ;
    for i:= 1 to N do
      readln( prDuomF, pyragParduotuveje[i] ) ; 
  
    close( prDuomF ) ;
  
  end ;

  procedure isvestiPirkini( N : integer; var p : TPirkinys ) ;
    var i : integer ;
  begin
 
    for i := 1 to N do
      write( rezF, p[i] : 4 ) ;
      
    writeln( rezF ) ;  
 
  end ;


  function pirkinysGalimas( N : integer; var p : TPirkinys ) : boolean ;
    var i : integer ;
        galimas : boolean ;
  begin
  
    galimas := true ;
    i := 1 ;
    
    while galimas and (i <= N) do
    begin
      galimas := pyragParduotuveje[i] >= p[i] ;
      i := i + 1 ;
    end ;
    
    pirkinysGalimas := galimas ;  
 
  end ;
  
  function generuoti( isvesti : boolean ) : integer ;
   var
       p : TPirkinys ;
       didintiI : integer ; (* kurios rusies pyrageliu kieki *)
                               (* bandysime didinti *)
       liko : integer ; (* kiek pyrageliu is K liko dar nepaskirstyta *)
       stop : boolean ;
       i : integer ;
       pirkiniuSk : integer ;
  begin

    pirkiniuSk := 0 ;

    for i := 1 to N - 1 do
      p[i] := 0 ;

    p[N] := K ;
    liko := 0 ;
    didintiI := N ;

    stop := false ;

    repeat

      if  pirkinysGalimas( N, p ) then begin
        pirkiniuSk := pirkiniuSk + 1 ;

        if isvesti then
          isvestiPirkini( N, p ) ;
      end ;

      if liko = 0 then begin
        if didintiI = 1 then
          stop := true
        else begin
         liko := p[didintiI] ;
         didintiI := didintiI - 1
        end ;
      end ;

      if liko > 0 then begin
        p[didintiI] := p[didintiI] + 1 ;
        liko := liko - 1 ;
        for i := didintiI + 1 to N do
          p[i] := 0 ;

        if liko > 0 then begin
         p[N] := liko ;
         didintiI := N ;
         liko := 0 ;
        end ;
      end ;

    until stop ;

    generuoti := pirkiniuSk ;
  
  end ;

begin

  ivestiPradDuomenis( 'PYRAG.DAT' ) ;

  assign( rezF, 'PYRAG.REZ' ) ;
  rewrite( rezF ) ;
  
  writeln( rezF, generuoti( false ) ) ;
  
  generuoti( true ) ;
  
  close( rezF ) ;


end.

