TAPN - TAPN

Tác giả: RR

Ngôn ngữ: C++

//Written by RR
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>

#define MAXN 32
#define FOR(i,a,b)  for(typeof(a) i=a; i<=b; i++)
#define FORD(i,a,b) for(typeof(a) i=a; i>=b; i--)

using namespace std;

long n,bit[MAXN];
long long m,res,c[MAXN][MAXN];

void init() {
     c[0][0]=1;
     FOR(i,1,MAXN-1) {
                     c[i][0]=1;
                     FOR(j,1,MAXN-1)
                       c[i][j]=c[i-1][j]+c[i-1][j-1];
     }
}

void solve() {
     long k=0;
     while (c[n][k]<m) {
           m-=c[n][k];
           k++;
     }
     m=c[n][k]-m+1;
     long len=n;
     FOR(i,1,n) {
                if (c[len-1][k]>=m) bit[i]=0;
                else {m-=c[len-1][k]; bit[i]=1; k--; }
                len--;
     }
     res=1;
     FOR(i,1,n)
       if (bit[i]==0) res=res*2+1;
       else res=res*3+1;
     cout<<res<<"\n";
}

int main() {
    #ifdef DEBUG
      freopen("input.txt","r",stdin);
      freopen("output.txt","w",stdout);
    #endif
    init();
    while (scanf("%ld %lld",&n,&m)==2)
          solve();
    return 0;
}

Download