# include <stdio.h>
# include <malloc.h>


struct t_Factorial
{  short  n,      // величина факториала n!
          N ;     // число сочетаний
   char  *value ; // массив, в котором лежат сочетания
   long   n_value ;
   short  fak[10] ; // число сочетаний от i
          // ------ величины, нужные при построении -------
   long   j ;
   short  I[10]   ; // значения бегучих индексов
   short  flag[10]; // занятые индексы
   
   t_Factorial( short nn );
   long   calc_factorial( short _n );
   void   make( short z );
   long   use( long Variant, long Word );
};

/************************************************************************/

long t_Factorial :: calc_factorial( short nn )
{  long i,NN ;
   for( NN=i=1 ; i<=nn ; i++ )
   {  NN*=i ; fak[i]=NN ;  }
   return NN ;
}
/************************************************************************/

void t_Factorial :: make( short z )
{  long i,z1 ;

   if( z<0 )
   {  j++ ;
      z1=n*(N-j) ;
      for( i=0 ; i<n ; i++ )
	 value[z1+i]=I[i] ;      
      return ;
   }
  
   for( I[z]=0 ; I[z]<n ; I[z]++ )
   {  if( flag[I[z]]==0 )
      {   flag[I[z]]=1 ;          
	  make( z-1 );
          flag[I[z]]=0 ;
      }
   }

}
/************************************************************************/
t_Factorial :: t_Factorial( short _n )
{   short i,i1 ;

    for( i=0 ; i<10 ; i++ )
       I[i]=flag[i]=0 ;
    n=_n ;
    N=calc_factorial( n );
    n_value=n*N ;
    value=(char *)calloc( n_value,sizeof(char) );
    j=0 ;
    make( n-1 );
/*
    for( i=0 ; i<N ; i++ )
    {  printf("\n");
       for( i1=0 ; i1<n ; i1++ )
          printf( "%d",value[i*n+i1] );
    }  
*/
}
/************************************************************************/
long t_Factorial :: use( long Variant, long Word )
{
   return value[Variant*n+Word] ;
}