| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
终于过了,每次往上往下走需要特别注意啊!附代妈//============================================================================
// Name : main1037.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
const int UP = 1;
const int DOWN = 0;
int main() {
long long int num[21][21][2] = {{{0}}};//第一维:个数 第二维:开头的数 第三维:上升为1,下降为0
num[2][1][UP] = 1;
num[2][2][DOWN] = 1;
for(int i = 3; i <= 20; i++){
for(int j = 1; j <= i; j++){
for(int k = j; k <= i-1; k++){
num[i][j][UP] += num[i-1][k][DOWN];
}
for(int k = 1; k < j; k++){
num[i][j][DOWN] += num[i-1][k][UP];
}
}
}/*
for(int i = 3; i <= 20; i++){
for(int j = 1; j <= i; j++){
cout << num[i][j][DOWN] << " " << num[i][j][UP] << endl;
}
}*/
int cases;
cin >> cases;
for(int ii = 0; ii < cases; ii++){
int len;
long long int ord;
cin >> len >> ord;
if(len == 1){
cout << 1 << endl;
continue;
}
int state[21] = {0};
int res[21] = {0};
long long int sum = 0;
int ud, kt;
for(int j = 1; j <= len; j++){
for(int k = DOWN; k <= UP; k++){
sum += num[len][j][k];
if(sum >= ord){
ud = k;
kt = j;
ord -= (sum - num[len][j][k]);
goto rub;
}
}
}
rub:
state[kt] = 1;
res[0] = kt;
int cnt = 1;
//cout << res[0] << " ";
for(int i = len-1; i > 1; i--){
ud = 1-ud;
long long int sum = 0;
int ks = 0;
if(ud == UP) ks = 1;
else{
for(int j = kt+1; ; j++){
if(state[j] == 0){
ks = j;
break;
}
}
//算情况内的开始
int s = 0;
for(int j = 1; j <= ks; j++){
if(state[j] == 0) s++;
}
ks = s;
}
for(int j = ks; j <= i; j++){
sum += num[i][j][ud];
if(sum >= ord){
kt = j;
ord -= (sum - num[i][j][ud]);
break;
}
}
//cout << kt << endl;
//下面确定这一轮真正的开头
int zzkt = 0;
for(int j = 1; j <= len; j++){
if(state[j] == 0) zzkt++;
if(zzkt == kt) {
kt = j;
break;
}
}
//cout << kt << endl;
state[kt] = 1;
res[cnt] = kt;
//cout << kt << " ";
cnt++;/*
for(int j = 1; j <= len; j++){
cout << state[j] << " ";
}
cout << endl;*/
}
int zh = 0;
for(int i = 1; i <= len; i++){
if(state[i] == 0){
state[i] = 1;
zh = i;
break;
}
}
for(int i = 0; i < len-1; i++) cout << res[i] << " ";
cout << zh << endl;
}
//cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator