一个研究财团正在建造一个新的数据中心。在数据中心中,一组计算机被设置为协同工作,并通过网络进行通信。该网络仅通过计算机之间的直接双向链路工作。如果两台计算机 $c_1$ 和 $c_2$ 没有直接链路连接,只要存在至少一条链路路径 $l_1, l_2, \dots, l_k$,使得链路 $l_i$ 和 $l_{i+1}$ 共享一个端点,$c_1$ 是 $l_1$ 的一个端点,$c_2$ 是 $l_k$ 的一个端点,它们仍然可以相互通信。任意两台计算机之间最多只能有一条直接链路。
财团要求你提交一份设计方案,说明网络中有多少台计算机以及它们是如何连接的。你提交的每项网络设计必须符合以下特定限制:
- 网络中的计算机数量必须在 $L$ 到 $U$ 之间(含 $L$ 和 $U$)。
- 每台计算机必须恰好是 4 条链路的端点,将其连接到其他 4 台不同的计算机。
- 每一对计算机都必须能够按照上述方式相互通信。
- 即使系统关闭时 ID 被随机更改,计算机也必须能够唯一地识别自身。
关于最后一点的详细说明:网络设计中的每台 $N$ 台计算机最初都被分配了一个 1 到 $N$ 之间的唯一整数作为标识符。然而,在停机一段时间后,系统可能会启动,标识符会被重新排列——也就是说,每台计算机仍然拥有一个 1 到 $N$ 之间的唯一整数,但不一定是原来的那个。网络必须能够在没有任何其他信息(仅有现有的直接链路)的情况下恢复原始的标识符。
为了评估你的网络设计,研究财团建立了一个自动化程序。该程序将接收你的一个网络设计,验证上述条件 1-3,然后发回一份带有以下更改的网络设计副本:
- 唯一 ID 已被随机置换(即,每个 ID 现在等概率地出现在任何一台计算机上),
- 每条链路都按 ID 从小到大的顺序排列(使用新的 ID),并且
- 链路集合按第一个端点(使用新的 ID)的升序排列,若第一个端点相同,则按第二个端点从小到大的顺序排列(即字典序)。
你需要能够准确确定 ID 是如何更改的。形式上,自动化程序将创建一个 1 到 $N$ 的秘密随机置换 $f$,并将其分配给“空白副本”网络中的计算机,该副本移除了所有先前的链路。然后,对于你网络设计中计算机 $i$ 和 $j$ 之间的每条链路,它会在副本中添加一条 $f(i)$ 和 $f(j)$ 之间的链路。你必须准确地重现自动化程序创建的 $f$。如果存在另一个不同的 $f'$ 也能产生相同的结果,而你返回了 $f'$,财团将不会接受你的网络设计,因为在这种情况下,你无法确保恢复的 ID 就是原始 ID。
对于 10 到 100 之间的每个 $N$(含 10 和 100),都至少存在一个符合上述所有限制的 $N$ 台计算机网络,且具有以下特性:对它应用两个不同的置换 $f$ 和 $f'$ 会产生两组不同的链路。
输入输出
这是一个交互式问题,这意味着输入和输出的概念与标准 Code Jam 问题不同。你将与一个既提供信息又评估你响应的独立进程进行交互。所有信息都通过标准输入进入你的程序;你需要传达的任何内容都应通过标准输出发送。请记住,许多编程语言默认会对输出进行缓冲,因此在阻塞等待响应之前,请确保你的输出确实已发送(例如,通过刷新缓冲区)。
最初,你的程序应读取包含单个整数 $T$ 的单行,表示测试用例的数量。然后,你需要处理 $T$ 个测试用例。
对于每个测试用例,你的程序将首先读取包含两个整数 $L$ 和 $U$ 的单行,表示网络设计中计算机数量的包含范围。
然后,你需要创建一个包含 $N$ 台计算机的网络设计,并打印 $2N+1$ 行来表示该设计。第一行必须包含一个整数 $N$。其余 $2N$ 行必须各包含两个整数 $A$ 和 $B$,每个代表计算机 $A$ 和 $B$ 之间的一条不同链路,其中 $A \neq B$。注意,如果你列出了链路 $A\ B$,则不能再次列出 $A\ B$ 或 $B\ A$。
在读取你的网络设计后,评测机将首先检查上述前三个条件。如果其中任何一个未满足,评测机将向你发送包含单个 $-1$ 的单行,然后结束所有通信并等待你的程序结束。如果你的程序确实正确完成且没有违反其他限制,它将收到 Wrong Answer 判决。
如果所有条件都满足,评测机将发送 $2N+1$ 行。第一行将包含一个整数 $N$(与你发送的 $N$ 相同)。然后,接下来的 $2N$ 行将各包含两个整数,描述网络设计副本的链路,格式与你使用的相同。副本是按照上述方式生成的,置换 $f$ 是从所有可能的置换中均匀随机选择的,且与你的网络设计无关。
为了完成一个测试用例,你需要向评测机发送一行包含 $N$ 个整数 $X_1, X_2, \dots, X_N$ 的数据,表示你分配数字 $i$ 的计算机在评测机的副本中被分配了数字 $X_i$(对于所有 $i$)。
如果该列表不是评测机生成的列表,你将收到 Wrong Answer 判决。如果是最后一个测试用例,评测机将不再发送额外信息。否则,评测机将发送包含单个 $-1$ 的单行,然后不再发送额外信息。在这两种情况下,评测机都会等待你的程序结束,并且仅在程序正常结束且未违反任何资源限制的情况下才分配 Wrong Answer 判决。
在解决所有测试用例后,你不应向评测机发送额外信息。换句话说,如果你的程序在为最后一个测试用例打印 $X$ 列表后继续向标准输出打印内容,你将收到 Wrong Answer 判决。
注意,允许你为不同的测试用例提交相同的网络设计,只要该设计符合两个测试用例的所有限制即可。此外,评测机中随机生成的种子是固定的,因此以相同的顺序发送相同的一组原始网络设计将得到相同的一组副本。
样例
输入格式 1
2 6 50 6 1 2 1 4 1 5 1 6 2 3 2 5 2 6 3 4 3 5 3 6 4 5 4 6
输出格式 1
6 2 4 1 2 3 1 1 4 1 5 2 3 2 6 3 5 3 6 4 5 4 6 5 6 2 5 6 1 3 4
说明
注意,此样例交互为了说明方便,使用了比实际数据更小的 $L$ 值。还要注意,不存在恰好 6 台计算机的网络具有“应用两个不同的置换 $f$ 和 $f'$ 会产生两组不同的链路”这一特性,因此即使问题的限制允许,设计一个恰好 6 台计算机的网络也是一个糟糕的主意!