TAPN - TAPN

Tác giả: hieult

Ngôn ngữ: C++

#include <stdio.h>
//#include <conio.h>
long long KQ(long long a[],long long n)
  {
  long long T=1;
  for(long i=1;i<=n;i++)
    {
    if(a[i]==0)
      T=T*2+1;
    else T=T*3+1;
    }
  return T;
  }     
main()
{
long long C[33][33],a[33],n,m,t;
for(long i=0;i<=32;i++)
  for(long j=0;j<=32;j++)
    C[i][j]=0;
for(long i=0;i<=32;i++)    
  C[0][i]=1;
for(long i=1;i<=32;i++)    
  for(long j=0;j<=i;j++)
    C[j][i]=C[j][i-1]+C[j-1][i-1];
while(scanf("%lld %lld",&n,&m)>0)
  {
  for(long i=1;i<=n;i++)
    a[i]=0;
  for(long i=0;i<=n;i++)
    {
    //printf("%lld ",m);             
    if(m<=C[i][n])
      {
      //printf("0 ");
      t=i;            
      break;
      }
    else m=m-C[i][n];
    }
  //printf("1 ");
  long u=n-1;  
  for(long i=t;i>=1;i--)
    {
    while(1)
      {
      if(m<=C[i-1][u])
        {
        a[n-u]=1;
        u--;
        break;
        }
      else
        m=m-C[i-1][u];
      u--;
      }
    }
  printf("%lld\n",KQ(a,n));
  }                        
//getch();
}        

Download