本地题面缓存已迁移,解析内容待补充。
OJ: noi_openjudge
题目 ID: ch0405-39
难度:未知
标签:python
日期: 2026-07-30 23:01
题意
完整题面见同目录的 problem.md。
思路
代码
Python代码
python
MAX_N = 20
up = [[0] * (MAX_N + 1) for _ in range(MAX_N + 1)]
down = [[0] * (MAX_N + 1) for _ in range(MAX_N + 1)]
up[1][1] = down[1][1] = 1
for length in range(2, MAX_N + 1):
for rank in range(1, length + 1):
up[length][rank] = sum(down[length - 1][next_rank - 1] for next_rank in range(rank + 1, length + 1))
down[length][rank] = sum(up[length - 1][next_rank] for next_rank in range(1, rank))
def continuation_count(length: int, rank: int, relation_to_next: int) -> int:
if length == 1:
return 1
return up[length][rank] if relation_to_next > 0 else down[length][rank]
for _ in range(int(input())):
length, catalogue_number = map(int, input().split())
remaining = list(range(1, length + 1))
answer = []
previous_relation = None
while remaining:
for index, value in enumerate(remaining):
if previous_relation is not None:
relation = 1 if answer[-1] < value else -1
if relation == previous_relation:
continue
else:
relation = None
rank = index + 1
rest_length = len(remaining)
if rest_length == 1:
count = 1
elif relation is None:
count = up[rest_length][rank] + down[rest_length][rank]
else:
count = continuation_count(rest_length, rank, -relation)
if catalogue_number > count:
catalogue_number -= count
continue
answer.append(value)
remaining.pop(index)
previous_relation = relation
break
print(*answer)