本地题面缓存已迁移,解析内容待补充。
OJ: noi_openjudge
题目 ID: ch0405-97
难度:未知
标签:python
日期: 2026-07-30 23:01
题意
完整题面见同目录的 problem.md。
思路
代码
Python代码
python
catalan = [1]
for nodes in range(1, 20):
catalan.append(sum(catalan[left] * catalan[nodes - 1 - left] for left in range(nodes)))
def build(nodes: int, rank: int) -> str:
if nodes == 0:
return ""
for left_nodes in range(nodes):
right_nodes = nodes - 1 - left_nodes
block = catalan[left_nodes] * catalan[right_nodes]
if rank >= block:
rank -= block
continue
left_rank, right_rank = divmod(rank, catalan[right_nodes])
left = build(left_nodes, left_rank)
right = build(right_nodes, right_rank)
return (f"({left})" if left else "") + "X" + (f"({right})" if right else "")
raise ValueError("invalid rank")
prefix = 0
for value in iter(input, "0"):
order = int(value)
nodes = 1
previous_total = 0
while previous_total + catalan[nodes] < order:
previous_total += catalan[nodes]
nodes += 1
print(build(nodes, order - previous_total - 1))