TAPN - TAPN
Tác giả: khuc_tuan
Ngôn ngữ: C++
#include <cstdio>
#include <set>
using namespace std;
int main() {
int n;
long long m;
long long F[32][32];
memset( F, 0, sizeof(F));
F[0][0] = 1;
for(int i=1;i<32;++i) {
for(int j=0;j<=i;++j) {
F[i][j] = F[i-1][j];
if(j>0) F[i][j] += F[i-1][j-1];
}
}
while(scanf("%d%lld", &n, &m) != EOF) {
long long r = 1;
for(int i=0;i<=n;++i) {
if(m>F[n][i]) m -= F[n][i];
else {
int pos = n;
int sl = i;
while(pos > 0) {
if(sl > 0 && m <= F[pos-1][sl-1]) {
r = r * 3 + 1;
--sl;
--pos;
}
else {
if(sl>0) m -= F[pos-1][sl-1];
r = r * 2 + 1;
--pos;
}
}
break;
}
}
printf("%lld\n", r);
}
return 0;
}