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;
}

Download